美文网首页
Spring 与 AOP(第五讲)

Spring 与 AOP(第五讲)

作者: 辽A丶孙悟空 | 来源:发表于2020-08-03 08:58 被阅读0次
    自动代理生成器

    前面代码中所使用的代理对象,均是由 ProxyFactoryBean 代理工具类生成的。而该代理工具类存在着如下缺点:
    (1)一个代理对象只能代理一个 Bean,即如果有两个 Bean 同时都要织入同一个切面,这时,不仅要配置这两个 Bean,即两个目标对象,同时还要配置两个代理对象。
    (2)在客户类中获取 Bean 时,使用的是代理类的 id,而非我们定义的目标对象 Bean 的 id。我们真正想要执行的应该是目标对象。从形式上看,不符合正常的逻辑
    Spring 提供了自动代理生成器,用于解决 ProxyFactoryBean 的问题。常用的自动代理生成器有两个:
    ① 默认 advisor 自动代理生成器。
    ② Bean 名称自动代理生成器。
    需要注意的是,自动代理生成器均继承自 Bean 后处理器 BeanPostProcessor。容器中所有 Bean 在初始化时均会自动执行 Bean 后处理器中的方法,故其无需 id 属性。所以自动代理生成器的 Bean 也没有 id 属性,客户类直接使用目标对象 bean 的 id。
    自动代理生成器,均是继承自 BeanPostProcessor,Bean 后处理器。查看源码:


    • 默认 advisor 自动代理生成器
      DefaultAdvisorAutoProxyCreator 代理的生成方式是,将所有的目标对象与 Advisor 自动结合,生成代理对象。无需给生成器做任何的注入配置。注意,只能与 Advisor 配合使用。
      这种代理的配置很简单,如下:


    • Bean 名称自动代理生成器
      DefaultAdvisorAutoProxyCreator 会为每一个目标对象织入所有匹配的 Advisor,不具有选择性,且切面只能是顾问 Advisor 。而 BeanNameAutoProxyCreator 的代理生成方式是,根据 bean 的 id,来为符合相应名称的类生成相应代理对象,且切面既可以是顾问 Advisor 又可以是通知 Advice 。
      举例: aop03_01 包。
      注意,只需要修改配置文件中的代理生成配置,及测试类中的通过 getBean() 获取的 bean 的 id 为目标类 beanld 即可。




      beanNames:指定要增强的目标类的id.
      interceptorNames:指定切面。可以是顾问 Advisor,也可以是通知 Advice 。

      对于自动代理生成器在配置时,需要注意,即使只有一个目标对象,属性也为 beanNames,且对于 Bean 的名称的指定,可以使用通配符*号。


      当然,对于多个 Bean 名称的情况,还可以使用<list/>标签的形式。

    相关文章

      网友评论

          本文标题:Spring 与 AOP(第五讲)

          本文链接:https://www.haomeiwen.com/subject/xgjrrktx.html