我是一个使用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,这是获取代理实例的最佳方法吗?
答案 0 :(得分:3)
另一种选择是使用AspectJ和@Configurable。 春天似乎走向了这些日子(偏爱)。
如果您使用Spring 3,我会调查它,因为它比基于代理的aop更快(性能)和更灵活。
答案 1 :(得分:1)
两种方法都在同一个代理中,而AOP功能只是丰富了来自外部的调用(参见Understanding AOP Proxies)。您有三种方法可以处理这种限制:
((Service)AopContext.currentProxy()).method1()
(有效,但违反了AOP,请参阅Understanding AOP Proxies的结尾)答案 2 :(得分:0)
您可以使您的ServiceImpl类实现BeanFactoryAware接口,并通过提供的bean工厂进行查找。但这不再是依赖注入了。
最好的解决方案是将method1放在另一个服务bean中,该服务bean将被注入现有的服务bean中,并且您的现有服务bean将委托给它。