如何在spring项目的编译时使用带有aspectJ的weaven

时间:2015-08-26 10:20:41

标签: spring aspectj spring-aop aspectj-maven-plugin

我们正在使用Spring,我们使用了Spring AOP。由于使用Spring AOP的{​​{1}}的性质,我们在通话中调整Proxy时会达到其限制。 即   如果正在呼叫A

,B执行的方面将无法运行
join point

为了解决这个问题,我们在编译时使用public void A(){ B() } public void B(){ } weaven。

哪个好,哪个好。但是,问题是让它与ApsectJ一起使用,即让Spring Bean在方面类中工作。

Pom.xml Maven插件

Autowired

修改

Spring autowired bean for @Aspect aspect is null

的副本

info on how to get aspectj to work with maven

1 个答案:

答案 0 :(得分:0)

在编译时使用AspectJ并确保弹簧自动装配魔法可以正常工作

根据AspectJ doc aspectOf Chapter。为了使某些模块知道该方面是某个方面应该使用aspectOfSpringfeature

 <bean id="a" class="com.someinterface.A" factory-method="aspectOf"></bean>

这将导致上面的A为Spring Bean,奖励Spring将知道这是其他代码的aspect。这足以让Spring在方面内使用Autowire 魔法

注意使用aspectOf需要xml configuration。我试图用@Configurable获得相同的结果,但它不起作用。如果某人有一些信息,那就太棒了。 :)

奖励 - 使用Spring AOP代理方面(在运行时间内)

spring设置为扫描@Aspect并将其设为春豆

<context:component-scan base-package="com.centure" >
     <context:include-filter type="annotation"     expression="org.aspectj.lang.annotation.Aspect"/> 
</context:component-scan>

在这种情况下,每件事都可以开箱即用

private SomeService service;
public SomeService getService() {
    return service;
}

@Autowired
public void setService(SomeService) {
    this.service = service;
}
@Aspect
public class myAspect {
    @Pointcut("execution(public * com.myinterface.save(..))")
         public void save() {
    }

@Around("myAspect () && args(thearg)")
public Object doBasicProfiling(ProceedingJoinPoint pjp, TheObject thearg)
         throws Throwable {

    Object retVal = null;
    try {
        retVal = pjp.proceed();
    } catch (Throwable e) {
        e.printStackTrace();
    }

    return retVal;
    }