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 许可协议
方面应用于 bean 周围的 _代理_。请注意,每次您获得对 bean 的引用时,它实际上并不是您的配置中引用的类,而是一个实现相关接口的合成类,委托给实际类并添加功能,例如您的 AOP。
在上面的示例中,您 直接 在类上调用,而如果该类实例作为 Spring bean 注入到另一个实例中,它将作为其代理注入,因此将在代理上调用方法调用(并且将触发方面)
如果您想实现上述目标,您可以将
method1
/method2
拆分为单独的 bean,或者使用非面向 spring 的 AOP 框架。Spring 文档(“了解 AOP 代理”部分) 对此进行了详细说明,并提供了一些解决方法(包括我上面的第一个建议)