是否可以编织一个方面来动态实例化类?

时间:2011-04-21 07:26:59

标签: spring dynamic aspectj

我使用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)实例化的类的方法调用?

2 个答案:

答案 0 :(得分:2)

如果我对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编织,所以我不需要在实践中使用这种东西。)

答案 1 :(得分:1)

不,你只能使用Spring AOP来建议Spring bean(因为Spring在幕后创建了一个代理对象)。您必须使用完整的AspectJ,或在Spring容器中创建MyService。请参阅http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-choosing