我使用Spring并具有包装某些类的方面:
@Aspect
public class LoggingAspect{
@Around("execution(public * com.service.MyService.doStuff(..))")
public Object log(){
...
}
}
并在上下文xml中:
<aop:aspectj-autoproxy/>
<bean id="loggingAspect" class="com.bla.bla.bla.LoggingAspect"/>
问题在于MyService的实例是在运行时创建的,因此Spring在上下文初始化阶段对此类一无所知.在这种情况下,是否可以使用方面来包装使用new(不是Spring)实例化的类的方法调用?
解决方法:
如果我的the Spring docs读数正确,那么您可以这样做(对于基于Spring代理的编织):
ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.addInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());
Pojo pojo = (Pojo) factory.getProxy();
或这样(用于AspectJ风格的编织):
AspectJProxyFactory factory = new AspectJProxyFactory(new SimplePojo());
factory.addAspect(new RetryAspect());
Pojo proxy = factory.getProxy();
(我通过Bean配置驱动所有AOP编织,因此实际上不需要使用这种方法.)