zoukankan      html  css  js  c++  java
  • spring为什么要注入接口

     首先说明,注入的对象确实为实现类的对象。(并不是实现类的代理对象,注入并不涉及代理)

      如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术是通过动态代理实现的,而spring默认是JDK动态代理,对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。如:

    //接口:IA
    
    //实现类:AImpl
    
    //增强类:AImplProxy
    
    AImpl aImpl = new AImpl();
    
    //通过JDKProxyFactory创建代理对象
    JDKProxyFactory factory = new JDKProxyFactory(aImpl);
    AImplProxy aImplProxy = factory.createProxy();//这个增强类对象aImplProxy 只能强转为IA,而不能转为AImpl,因为JDK代理得到的AImplProxy类与AImpl是兄弟关系而非父子

    由于以上原因,如果将对象注入给实现类而非接口的话,在代理时就会报错。

    解决方法,让Spring强制使用Cglib代理:

    <aop:aspectj-autoproxy proxy-target-class="true"/>

     cglib代理类和实现类之间是父子关系,自然可以用父类(实现类)去接收子类对象(代理类对象即增强类对象)。

    不过应该不会需要这么做,使用接口本来就是解耦的,你直接用实现类接收注入对象岂不是失去了注入的意义。

    转自:https://www.cnblogs.com/lee10010/p/7888121.html

  • 相关阅读:
    20.12.2 leetcode7
    20.12.1 leetcode34
    20.11.30 leetcode767
    20.11.29 leetcode976
    Codeforces632E 选择/小偷与商店 背包DP
    魔法少女 DP NG放的水
    逆反的01串 模拟 NG放的水
    最大数maxnumber bzoj1012 JSOI2008 单调队列
    组合数问题 vijos2006 NOIP2016 D2T1 杨辉三角 排列组合 前缀和
    信息传递 vijos1979 NOIP2015D1T2 强连通分量 tarjan模版题
  • 原文地址:https://www.cnblogs.com/menbo/p/10907288.html
Copyright © 2011-2022 走看看