什么是为Spring AOP注入相同服务实例的最佳方式

时间:2011-02-23 12:53:37

标签: java spring aop spring-aop

我是一个使用Spring的@Service构造型注释的ServiceImpl,并且有两个方法,每个方法都使用Spring截获的自定义注释进行注释。

@Service    
public class ServiceImpl implements Service{

       @CustomAnnotation
       public void method1(){
       ...
       }

       @AnotherCustomAnnotation
       public void method2(){
        this.method1();   
        ...
       }
    }
}

现在Spring使用基于代理的AOP方法,因此当我使用this.method1()拦截器@CustomAnnotation时将无法拦截此调用,我们曾经在另一个FactoryClass中注入此服务,这样我们就能够获取代理实例,如 -

  @AnotherCustomAnnotation
    public void method2(){
        someFactory.getService().method1();   
        ...
    }

我现在正在使用Spring 3.0.x,这是获取代理实例的最佳方法吗?

3 个答案:

答案 0 :(得分:3)

另一种选择是使用AspectJ和@Configurable。 春天似乎走向了这些日子(偏爱)。

如果您使用Spring 3,我会调查它,因为它比基于代理的aop更快(性能)和更灵活。

答案 1 :(得分:1)

两种方法都在同一个代理中,而AOP功能只是丰富了来自外部的调用(参见Understanding AOP Proxies)。您有三种方法可以处理这种限制:

  1. 改变你的设计(这就是我的建议)
  2. Change proxy type从JDK-proxy到proxy-target-class(基于CGLib的子类)没有,这没有帮助,请参阅@ axtavt的评论,它必须是静态的AspectJ编译。
  3. 使用((Service)AopContext.currentProxy()).method1()(有效,但违反了AOP,请参阅Understanding AOP Proxies的结尾)

答案 2 :(得分:0)

您可以使您的ServiceImpl类实现BeanFactoryAware接口,并通过提供的bean工厂进行查找。但这不再是依赖注入了。

最好的解决方案是将method1放在另一个服务bean中,该服务bean将被注入现有的服务bean中,并且您的现有服务bean将委托给它。