gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:03:20 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com