Spring AOP:如何拦截内部类?

时间:2014-11-02 19:52:16

标签: java spring aop

我的班级:

@Aspect
public class ServiceAspect {
    @Before("execution(public * com.test.server.support.service.*.Client.*(..))")
    public void before(JoinPoint joinPoint) {
        System.out.println("....");
    }
}

spring-config.xml仅限内容:

<context:annotation-config/>

弹簧servlet.xml中:

<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

<context:component-scan base-package="com.test.client.support">
    <context:include-filter type="aspectj" expression="com.test.client.support.aspect.ServiceAspect"/>
</context:component-scan>
<context:component-scan base-package="com.test.manager"/>

<aop:aspectj-autoproxy proxy-target-class="true"/>

我希望以这种方式可以xxx.Client每个类调用以下方法,自动创建连接。

当项目当前运作时,AOP无响应。

然而,如果在之前

("execution (public * com.test.server.support.service.*.Client.*(..))") 

IntoPointcut

("@within (org.springframework.stereotype.Controller)")

,您可以在方法之前输入

注意:客户端类是自动生成的Thrift IDL。

1 个答案:

答案 0 :(得分:3)

Spring AOP仅适用于声明为Spring Beans的类的公共方法。我猜你的内部类可能不是Spring Beans。所以要么你应该

  • 重构你的代码以摆脱内部类或
  • 制作你的内心类Spring Beans或
  • 从Spring AOP切换到完整的AspectJ(<context:load-time-weaver/>而不是<aop:aspectj-autoproxy/>),请参阅Spring documentation, chapter 9.8

更新: AspectJ中的within()切入点也包含内部类,这是记录在案的。如果这也适用于Spring AOP,我不知道。