什么是为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,这是获取代理实例的最佳方法吗?

另一种方法是使用AspectJ和@Configurable。 spring似乎走向了这些日子(偏爱)。

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

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

  1. 改变你的设计(这就是我的建议)
  2. 将代理类型从JDK-proxy 更改为proxy-target-class(基于CGLib的子类) Nope,这没有帮助,请参阅@ axtavt的注释,它必须是静态的AspectJ编译。
  3. 使用((Service)AopContext.currentProxy()).method1() (Works,但是违反了AOP,请参阅了解AOP代理的结束)

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

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