我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > Spring IOC(反转控制、依赖注入) 好处和劣势
总共48087条微博

动态微博

查看: 1521|回复: 0

Spring IOC(反转控制、依赖注入) 好处和劣势

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-12-29 16:20:57 |只看该作者 |倒序浏览
    spring IOC(反转控制、依赖注入) 好处和劣势
    . P4 f& i* `* D' jIoC是什么?Inversion of Control,即反转控制,或许说为依赖注入更为合适。IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。
    . j: s  T/ {) B2 T. }Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执 行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了,如:' W3 |% e+ |4 j/ o: [1 a
    Class A{
    7 o7 i: m  R" k' o7 ?AInterface a;8 E6 @9 U9 ^/ K! j& f7 k
    A(){}
    # I! V- S. |' `- _- j  ^aMethod(){9 o6 ]" L1 O8 ]) {% H
    a = new AInterfaceImp();6 g, T7 V# p2 O% h
    }0 Y/ j4 K/ ?# L2 J/ n3 y  \
    }. R! o7 _8 j/ B, W( Z
    ClassA与AInterfaceImp就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。当然我们可以建立一个 Factory来根据条件生成想要的AInterface的具体实现,即:- Q) K; D! M: D" b; X! [
    InterfaceImplFactory{, U( c& z# N1 O7 D4 Q
    AInterface create(Object condition){- V. S5 O$ P9 y1 O& b) r
    if(condition = condA){5 \  ^) W( g3 g( f8 U
    return new AInterfaceImpA();
    ! t0 w! [; _0 n0 c}elseif(condition = condB){3 L8 @; C) i8 a3 i
    return new AInterfaceImpB();8 Y. l% M/ y# g3 n5 L
    }else{3 s6 V# \, ^! @. ^% r, j: r
    return new AInterfaceImp();
    9 d1 C: s! M' k2 N9 N" j! x}
    & X1 l' m& _1 n: }5 i# s4 _, w! U}/ k7 Y- m. p6 M+ w: c" }
    }0 V( F0 Z, G$ A
    表 面上是在一定程度上缓解了以上问题,但实质上这种代码耦合并没有改变。通过IoC模式可以彻底解决这种耦合,它把耦合从代码中移出去,放到统一的XML文 件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了。/ i; u2 F. j" W! z
    IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实 际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。- T1 k/ F0 U! Z. K
    当前比较知名的IOC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。: o7 N  Z2 a: m) E+ q
    在上面的几个IOC容器中,轻量级的有Pico Container、Avalon、Spring、HiveMind等,超重量级的有EJB,而半轻半重的有容器有JBoss,Jdon等。
    7 p& Q$ K) s4 T可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是 把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。7 ?7 \# H4 w% m8 s1 h" D) J8 M9 |
    IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象 在生成时才决定要生成哪一种对象。反射的应用是很广泛的,象hibernate、String中都是用“反射”做为最基本的技术手段。$ e) L) o; c2 y- X) N; g: r9 h
    在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普通应用开来的原因。但经SUN改良优化后,反射方式生成 对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。
      E+ V6 e& y" [, D1 BIoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要 修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCIS硬盘了)。
    + z" ^7 ^. S6 `) nIoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(其实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象 生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3) 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。
    . d, Z/ [: F0 J: W( h6 g4 `# R/ r3 h( L

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表