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

2022-08-31 13:29:31

ABC 中定义了两种方法.java

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


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

我想在调用方法2时有AOP。因此,我创建了一个类,AOPLogger.java,在方法检查Access
中提供了方面功能 在配置文件中,我做了如下操作

<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>

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

我错过了什么吗?


答案 1

该方面应用于 Bean 周围的代理。请注意,每次获得对 Bean 的引用时,它实际上并不是配置中引用的类,而是实现相关接口、委派给实际类并添加功能(如 AOP)的综合类。

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

如果你想实现上述目标,你可以拆分/分成单独的bean,或者使用一个非弹簧导向的AOP框架。method1method2

Spring文档(“了解AOP代理”部分)详细介绍了这一点,以及一些解决方法(包括我上面的第一个建议)


答案 2

2022年更新:

现在我个人更喜欢使用这里描述的TransageHandler类 - 更干净和灵活的方式。

原答:

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

@Component
public class Foo {
    @Resource
    private Foo foo;
    
    public void method1(){
        ..
        foo.method2();
        ..
    }
    public void method2(){
        ..
    }
}

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

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


推荐