gpt4 book ai didi

spring - aspectj 和 spring 与 aspectj-autoproxy

转载 作者:行者123 更新时间:2023-12-03 19:02:19 25 4
gpt4 key购买 nike

我已经使用 @Aspect 注释声明了我的切面,但建议似乎没有得到应用。该方面适用于我拥有的其他一些项目,主要区别似乎是其他项目完全使用注释连接,并且这个特定项目是 xml 连接的。唯一连接注释的 bean 是 Aspect。所以我想知道spring的aspectj支持是否在使用aspectj-autoproxy时对在xml中定义bean的顺序很敏感。

例如,在 xml 中的 aspectj-autoproxy 之后声明的 bean 是否会被考虑用于 AOP 切入点?

编辑:

我移动了<aop:aspectj-autoproxy />直到所有 bean 都被创建之后仍然没有运气。

基本上我的代码包括:

@Component
@Aspect
public class SomeAspect {
@Pointcut("@annotation(MyAnnotation)")
public void isX() {}

@After("isX()")
public void XX() {
System.out.println("Called aspect");
}
}

我的 Controller 有类似的东西:
public class XController extends AbstractCommandController {
@MyAnnotation
public void handleX(...) {
// do stuff
}
@Override
protected void handle(...) {
return handleX(...);
}
}

然后spring xml是:
<context:component-scan base-package="package.of.some.aspect" />
<aop:aspectj-autoproxy />

<!-- the rest of the beans below -->
<bean id="someController" class="..." />

我以前的项目通过组件扫描捕获并加载了所有 bean。这就是这次不同的地方。

编辑2:
另一个区别是其他项目使用@Controller 和@RequestMethod。在这种情况下,我使用的是 AbstractCommmandController 的派生类。我想知道这是否适用:
http://forum.springsource.org/archive/index.php/t-46637.html

也就是说,我不能将建议应用于除 handleRequest() 之外的任何方法。

编辑3:

我最近的尝试是覆盖 handleRequest() 并在那里应用我的注释。假设当 spring 代理我的 Controller 时,它将看到注释并应用建议,因为它是通过公共(public)的、外部调用的方法调用的。这仍然行不通。

最佳答案

我看到你正在调用方法 handleX直接来自同一类中的另一个方法。这不会尊重注释,因为处理 AOP 注释的工作是由包装您的类并公开相同接口(interface)的 JDK 代理完成的。

您可以通过使用 CGLIB 而不是 JDK 代理来解决此问题,但根据我的经验,最可靠的解决方案就是不依赖任何 AOP 注释来调用内部调用的方法。

关于spring - aspectj 和 spring 与 aspectj-autoproxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390556/

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