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 类。
有什么我遗漏的吗?
最佳答案
aspect 被应用到 bean 周围的 代理。请注意,每次获得对 bean 的引用时,它实际上并不是配置中引用的类,而是实现相关接口(interface)、委托(delegate)给实际类并添加功能(例如 AOP)的合成类。
在您上面的示例中,您在类上直接调用 ,而如果该类实例作为 Spring bean 注入(inject)到另一个实例中,它会作为其代理注入(inject),因此将调用方法调用在代理上(并且方面将被触发)
如果你想实现上述目标,你可以将 method1
/method2
拆分成单独的 bean,或者使用非 spring 导向的 AOP 框架。
Spring doc (section "Understanding AOP Proxies")详细说明这一点,以及一些解决方法(包括我上面的第一个建议)
关于java - Spring AOP 不适用于另一个方法中的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564627/