zoukankan      html  css  js  c++  java
  • aop代理方式引起的spring注入bean(实现类)与获取bean(实现类)出错

    描述:

      现象一 :A 为 接口,AImpl 为 A 的实现类,且 AImpl 受 aop 扫描,且 aop 无特殊配置

           此时若:Spring 中 注入 AImpl 类型的bean,获取一样     报错

             Spring 中 注入 A 类型的bean ,获取一样          成功

      现象二 :B 没有实现接口,B受 aop 扫描,且 aop无特殊配置

           此时若:Spring 中 注入 B 类型的bean,获取一样           成功

    分析:

      1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
      2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
      3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

      现象一 :因为 AImpl 实现了 A 接口,所有自动使用了JDK proxy ,而JDK proxy 实现原理基于接口生成代理对象(详见下边链接)

           代理对象 类型不同于 AImpl ,所以报错

           JDK proxy 生成的代理对象也实现了A 接口,so  接口类型可以。

      现象二 :B 没有实现接口,故spring 采用 cglib 实现动态代理,其原理是生成子类(详见下边链接)

           so , 成功注入与获取。

    解决:

       Spring 中添加配置  <aop:aspectj-autoproxy proxy-target-class="true"/>

    参考:

       http://fuhuijun.iteye.com/blog/2253741

       JDK动态代理和CGLIB代理的区别

       Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

  • 相关阅读:
    文字
    <script type="text/x-template"> 模板
    防xss攻击
    url
    symmfony
    composer
    header 和http状态码
    bootstrap
    linux的设置ip连接crt,修改主机名,映射,建文件
    Centos上传下载小工具lrzsz
  • 原文地址:https://www.cnblogs.com/peak-c/p/6026945.html
Copyright © 2011-2022 走看看