我们正在使用Spring
,我们使用了Spring AOP
。由于使用Spring AOP
的{{1}}的性质,我们在通话中调整Proxy
时会达到其限制。
即
如果正在呼叫A
join point
为了解决这个问题,我们在编译时使用public void A(){
B()
}
public void B(){
}
weaven。
哪个好,哪个好。但是,问题是让它与ApsectJ
一起使用,即让Spring Bean
在方面类中工作。
Autowired
答案 0 :(得分:0)
根据AspectJ
doc aspectOf Chapter。为了使某些模块知道该方面是某个方面应该使用aspectOf
。 Spring
有feature
<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;
}