spring和aspectj,非代理对象的拦截方法

时间:2010-11-18 08:45:25

标签: java spring proxy aspectj

我想拦截来自非代理对象的方法。

我有一个类实例MyClass myClassInstance=new MyClass(),我想拦截myClassInstance方法的调用。

我知道所有代理都很好用,但我需要非代理的方面。

这可能吗?

感谢。

3 个答案:

答案 0 :(得分:5)

这是可能的,但这是不可取的。

您可以使用@Configurable,AspectJ将拦截来电。请阅读the 7.8.1 Using AspectJ to dependency inject domain objects with Spring section of the docs

简而言之 - AspectJ在编译时或加载时(使用相应的编织器)插入一些“魔法”,它会修改类,使它们成为弹簧上下文的一部分。

至于为什么我认为这是不可取的 - 这是通过修改类的结构而发生的黑暗魔法。这不是面向对象的方法,我认为很难支持。想象一下,6个月后,你的一位同事正在调试一个讨厌的问题。可能需要几天才能意识到这种魔法正在发生。这个意见虽然有所体现。功能就在那里,如果你需要它 - 使用它。

答案 1 :(得分:1)

使用Spring,我不相信(I appear to be wrong),使用AspectJ我相信只要你compile all the code with the AspectJ compiler就可以。但是我从未尝试过。

答案 2 :(得分:0)

您可以在Spring中启用加载时编织。然后,类加载器将在加载时将您定义的任何方面编织到类中 - 无论它们是否由Spring创建。

您需要通过将此行添加到上下文文件来启用LTW:

请参阅: http://static.springsource.org/spring/docs/3.0.0.M4/spring-framework-reference/html/ch07s08.html#aop-aj-ltw