Spring AOP 不适用于另一个方法内的方法调用

新手上路,请多包涵

ABC.java 中定义了两个方法

public void method1(){
   .........
   method2();
  ...........
}

public void method2(){
  ...............
  ...............
}

我想在调用 method2 时使用 AOP。因此,我创建了一个类 AOPLogger.java ,它具有在方法 checkAccess 中提供的方面功能

在配置文件中,我做了类似下面的事情

<bean id="advice" class="p.AOPLogger" />
<aop:config>
  <aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" />
  <aop:aspect id="service" ref="advice">
    <aop:before pointcut-ref="abc" method="checkAccess" />
  </aop:aspect>
</aop:config>

但是当我的 method2 被调用时,AOP 功能没有被调用,即 checkAccess 方法没有被 AOPLogger 类调用。

我有什么想念的吗?

原文由 Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 421
2 个回答

方面应用于 bean 周围的 _代理_。请注意,每次您获得对 bean 的引用时,它实际上并不是您的配置中引用的类,而是一个实现相关接口的合成类,委托给实际类并添加功能,例如您的 AOP。

在上面的示例中,您 直接 在类上调用,而如果该类实例作为 Spring bean 注入到另一个实例中,它将作为其代理注入,因此将在代理上调用方法调用(并且将触发方面)

如果您想实现上述目标,您可以将 method1 / method2 拆分为单独的 bean,或者使用非面向 spring 的 AOP 框架。

Spring 文档(“了解 AOP 代理”部分) 对此进行了详细说明,并提供了一些解决方法(包括我上面的第一个建议)

原文由 Brian Agnew 发布,翻译遵循 CC BY-SA 4.0 许可协议

2022 年更新:

现在我个人更喜欢使用 这里 描述的 TransactionHandler 类——更简洁和灵活的方式。

原答案:

它可以通过自我注入使用来完成。您可以通过注入的实例调用内部方法:

 @Component
public class Foo {
    @Resource
    private Foo foo;

    public void method1(){
        ..
        foo.method2();
        ..
    }
    public void method2(){
        ..
    }
}

从 Spring 4.3 开始,您也可以使用 @Autowired 来完成。

从 4.3 开始,@Autowired 还考虑了用于注入的自引用,即对当前注入的 bean 的引用。

原文由 Konstantin Zyubin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题