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

标签 java spring 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 类。

有什么我遗漏的吗?

最佳答案

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/

相关文章:

java - 如何从列表中删除,同时修改列表

java - 如何在 Java 中使用 i18n 代码模板而不是 Spring MVC 3 中的 JSTL

java - 从 Spring Security 捕获 "CommunicationException"

java - Spring boot - 有没有办法为给定的配置文件禁用 AOP?

java - 为什么我的 Spring AOP 在切入点内不起作用,但执行却起作用?

java - 在 JNI 上下文中存储 C++ 类

javafx TableView 未从数据库填充数据

java - Spring AOP CGLIB 代理的字段为空

javascript - Java servlet 无法读取 html select 标记名称

Spring Boot 2.0.0.M6 OAuth2 Web 应用程序客户端。不再有@EnableOauth2Sso;如何更换?