什么是为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代理 )。 您有三种方法可以处理这种限制:
- 改变你的设计(这就是我的建议)
-
将代理类型从JDK-proxy 更改为proxy-target-class(基于CGLib的子类)Nope,这没有帮助,请参阅@ axtavt的注释,它必须是静态的AspectJ编译。 - 使用
((Service)AopContext.currentProxy()).method1()
(Works,但是违反了AOP,请参阅了解AOP代理的结束)
您可以使ServiceImpl类实现BeanFactoryAware接口,并通过提供的bean工厂进行查找。 但这不再是dependency injection了。
最好的解决方案是将method1放在另一个服务bean中,该服务bean将被注入现有的服务bean中,并且您的现有服务bean将委托给它。