如何实现<aop:config>元数据来为pointcut </aop:config>捕获的类创建代理

时间:2012-11-15 16:30:23

标签: spring aop aspectj spring-aop

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

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

  2. Spring自己的实现 - 使用接口提供建议(BeforeAdviceAfterAdvice等)

  3. - 如果我错了,请纠正我 -

    现在,spring自己的实现由AutoproxyCreatorBeanNameAutoproxyCreatorDefaultAdvisorAutoproxyCreator)实现,它在使用BeanPostProcessor创建bean时创建代理。

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

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

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

    或加载时间waever用于这些。

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

1 个答案:

答案 0 :(得分:0)

这里有几个不同的区别。

  1. Spring AOP
    这有两种口味:
    • Classic(XML)Spring AOP
    • @AspectJ - Style Spring AOP
  2. 方面-J
    这也有两种风格:
    • Classic AspectJ(.aj)
    • @AspectJ - 样式AspectJ
  3. 两种版本的Spring AOP都是使用BeanPostProcessors和代理实现的。

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

    Spring AOP的现代版本和AspectJ的现代版本共享@AspectJ - 语法,但它们不能相互混淆:Spring AOP仅适用于使用代理的Spring Beans,因此只能拦截方法从外部调用。 AspectJ更改了方法的实际字节代码,因此完全独立于Spring。

    如果您想了解有关不同技术和口味的更多信息,我建议使用Spring Committer和AspectJ Guru AspectJ in Action预订Ramnivas Laddad

    您还应该阅读:Spring Reference: 8.4. Choosing which AOP declaration style to use