曾用名:控制反转(Inversion of Control ,IoC)
正用名:依赖注入(Dependency Injection)
举例:
一个人(java实例,调用者)需要一把斧头(java实例,被依赖对象)。
原始社会(原始方法):需要斧头的人需要自己磨一把斧头(调用者主动new一个被调用者)。
进入工业社会,工厂出现了。需要要斧头的人直接找到工厂购买斧头(调用者 通过工厂生产被调用者)。
进入共产主义社会,需要斧头的人不需要去找工厂,坐等社会提供斧头。
依赖注入方法:
- 1、设值注入:IoC容器使用成员变量的setter方法来注入被依赖的对象。
- 2、构造注入:IoC容器使用构造器来注入被依赖对象。
对比:
设值注入的优点:
1. 与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受、通过setter方法设定依赖关系显得更加直观、自然。
2.对于复杂的依赖关系如果采用构造注入,会导致构造器国语臃肿,难易阅读。Spring在创建Bean实例时,需要同时实例化起依赖的全部实例,因而导致性能下降。而使用设置注入,则能避免这些问题。
3.尤其是在某些成员变量可选的情况下,多参数的构造器更加笨重。
构造注入优点:
1.构造注入可以再构造器中决定依赖关系的注入顺序,优先依赖的优先注入。例如,组件中其他依赖关系的注入,长长需要依赖于Datasource的注入。采用构造注入,可以再代码中清晰地决定注入顺序。
2.对于依赖关系无需变化的Bean,构造注入更有用处。因为没有setter方法,所有的依赖关系全部在构造器内设定。因此,无需担心后续的代码对依赖关系产生破坏。
3.依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用这而言,组件内部的依赖关系完全透明,更符合高内聚的原则。
网友评论