0

正如我从 spring 3 文档中得到的那样,有两种 AOP 方式

  1. <aop:config>AspectJ -在 xml中包含元数据或使用注释@Aspect

  2. Spring 自己的实现 - 使用接口进行通知(BeforeAdviceAfterAdvice

--到目前为止如果我错了请纠正我-

现在 spring 自己的实现由AutoproxyCreator( BeanNameAutoproxyCreator, DefaultAdvisorAutoproxyCreator) 实现,它在创建 bean 时使用BeanPostProcessor.

但是 AspectJ 的代理是如何在 Spring 中完成的。Aspect 类如何由@Aspectof提供

<aop:config>
    <aop:aspect ref= "anyclasshavingAllAdviceMethod">
       <!-- (all aop:before,aop:after-throwing etc) -->
    </aop:aspect>
</aop:config>

用于创建代理。<aop:config>or的实现背后的机制是什么@Aspect

或加载时 waever 用于这些 .

注意:要实现 aop:config 我们不必提供任何额外的 bean 或 load-time-weaver 那么它是如何工作的?

4

1 回答 1

0

这里有几个级别的区别。

  1. Spring AOP
    这有两种风格:
    • 经典 (XML) Spring AOP
    • @AspectJ-Style Spring AOP
  2. Aspect-J
    这也有两种风格:
    • 经典 AspectJ (.aj)
    • @AspectJ-风格方面J

Spring AOP 的两种风格都是使用 BeanPostProcessors 和代理实现的。

AspectJ 的两种风格都是在编译时(字节码操作或单独编译)或类加载时(使用加载时编织器时)实现的

Spring AOP 的现代版本和 AspectJ 的现代版本共享@AspectJ-Syntax,但不要将它们相互混淆:Spring AOP 仅适用于使用代理的 Spring Bean,因此仅拦截来自外部的方法调用。AspectJ 改变了方法的实际字节码,因此完全独立于 Spring 工作。

如果您想了解更多关于不同技术和风格的信息,我推荐Spring Committer 和 AspectJ Guru Ramnivas Laddad的 Book AspectJ in Action

您还应该阅读:Spring 参考:8.4。选择要使用的 AOP 声明样式

于 2012-11-15T16:47:55.670 回答