使用XML的Java Spring AOP不起作用

时间:2013-07-17 23:30:56

标签: java spring spring-aop

我目前正在使用XML功能测试Spring的AOP,但我无法使其工作。

编辑: 只有在从类的构造函数调用方法时才会出现此问题。

我的applicationContext.xml:

<beans xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
  http://www.springframework.org/schema/tx 
  http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
  <aop:aspectj-autoproxy/>
  <bean id="aopClass" class="hu.viper.aoptest.AopClass"/>
  <bean id="mainClass" class="hu.viper.aoptest.MainClass"/>
  <aop:config>
    <aop:aspect ref="aopClass">
      <aop:pointcut id="pointCutBefore" expression="execution(* hu.viper.aoptest.MainClass.hello(..))"/>
      <aop:before method="writeAOP" pointcut-ref="pointCutBefore"/>
    </aop:aspect>
  </aop:config>
</beans>

我的MainClass.java:

package hu.viper.aoptest;

public class MainClass {

    public MainClass() {
        this.hello();
    }

    public void hello() {
        System.out.println("HELLO WORLD");
    }
}

我的AopClass.java:

package hu.viper.aoptest;

import org.aspectj.lang.JoinPoint;

public class AopClass {
    public void writeAOP(JoinPoint joinPoint) {
        System.out.println("This is the AOP message!");
    }
}

它构建完美,当我运行它时,它在netbeans的GlassFish输出上打印“HELLO WORLD”两次(我不知道为什么两次),但没有AOP消息。我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

proxy-target-class中使用<aop:config>强制使用CGLIB代理。

<aop:config proxy-target-class="true">
    .......
</aop:config>

如果您在客户端使用MainClass代理,则需要引用代理来调用hello()而不是this。请参考this nicely written doc about AOP Proxies了解我的目标。