【问题标题】:aspectj and spring with aspectj-autoproxyaspectj 和 spring 与 aspectj-autoproxy
【发布时间】:2011-06-17 19:03:42
【问题描述】:

我已经使用@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");
    }
}

我的控制器有类似的东西:

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(),我不能对任何方法应用建议。

EDIT3:

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

【问题讨论】:

  • 请贴一些代码;例如定义方面、建议和切入点的应用上下文。
  • @abalogh:我有一种感觉,如果我简化代码,它将起作用。当这些东西不能按预期工作时,调试 aspectj/spring 的最佳方法是什么?

标签: spring aspectj


【解决方案1】:

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

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

【讨论】:

  • 是的,我现在明白了。但是我也不能调用 spring 的 handle() 方法,因为它是受保护的,而且无论如何这也只是一个内部方法(!)。这不是spring所谓的“外部”方法。但我想要实现的是拦截并应用所有控制器子集的建议。如果不使用@Controller/@RequestMethod,我真的不知道该怎么做。建议?
  • 我会将此标记为正确答案,但有两个问题。首先,我必须重写公共方法 handleRequest 并将我的注释放在那里。而第二个方面j-autoproxy 需要在所有bean 都被实例化之后才发生。然后一切正常。
  • 说实话我没用过aspectj-autoproxy。我主要使用其他 AOP 集成(@Transactional、一些 Spring Security 的东西等)。我的一位同事发现了一个问题,即使用 @RequestMapping 的控制器方法似乎不尊重 Spring Security 注释。我想知道这是否相关。
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多