3

我是一个 ServiceImpl ,它使用 Spring 的 @Service 原型进行注释,并且其中有两个方法,每个方法都使用 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,这是获取代理实例的最佳方式吗?

4

3 回答 3

3

另一种选择是使用 AspectJ 和 @Configurable。春天似乎正在走向这些日子(有利)。

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

于 2011-02-23T13:21:21.837 回答
1

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

  1. 改变你的设计(这就是我的建议)
  2. 将代理类型从 JDK-proxy 更改为 proxy-target-class(基于 CGLib 的子类化)不,这没有帮助,请参阅 @axtavt 的评论,它必须是静态 AspectJ 编译。
  3. 使用((Service)AopContext.currentProxy()).method1()(有效,但严重违反 AOP,请参阅了解 AOP 代理的末尾)
于 2011-02-23T13:08:04.523 回答
0

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

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

于 2011-02-23T13:06:04.850 回答