依赖注入DI

Posted 吴二喵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖注入DI相关的知识,希望对你有一定的参考价值。

依赖注入通常有两种方式:
1、设值注入:IoC容器使用成员变量的setter方法来注入被依赖对象
2、构造注入:IoC容器使用构造器来注入被依赖对象

两种注入方式对比:
设值注入的的优点
1、与传统JavaBean的写法更相似,通过setter方法设定依赖关系显得更加直观、自然
2、对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring创建实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。
3、在某些成员变量可选的情况下,多参数的构造器更加笨重

构造注入的优点
1、构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。例如,组件中其他依赖关系的注入,常常需要依赖于datasource的注入。采用构造注入,可以在代码中清晰地决定注入顺序
2、对于依赖关系无须变化的Bean,构造注入更有用处。因为没有setter方法,所有的依赖关系全部在构造器内设定。因此,无须担心后续的代码对依赖关系产生破坏
3、依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。

建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。

配置简写

让我们来总结一下依赖注入配置及简写形式:

一、构造器注入:
1)常量值

简写:<constructor-arg index="0" value="常量"/>
全写:<constructor-arg index="0"><value>常量</value>


2)引用

简写:<constructor-arg index="0" ref="引用"/>
全写:<constructor-arg index="0"><ref bean="引用"/></constructor-arg>

二、setter注入:
1)常量值

    简写:<property name="message" value="常量"/>
        全写:<property name="message"><value>常量</value></ property>
   2)引用
     简写:<property name="message" ref="引用"/>
        全写:<property name="message"><ref bean="引用"/></ property>
   3)数组:<array>没有简写形式
   4)列表:<list>没有简写形式
   5)集合:<set>没有简写形式
   6)字典
    简写:<map>
             <entry key="键常量" value="值常量"/>
             <entry key-ref="键引用" value-ref="值引用"/>
            </map>
         全写:<map>
             <entry><key><value>键常量</value></key><value>值常量</value></entry>
             <entry><key><ref bean="键引用"/></key><ref bean="值引用"/></entry>
           </map>
   7)Properties:没有简写形式

以上是关于依赖注入DI的主要内容,如果未能解决你的问题,请参考以下文章

一文搞懂│php 中的 DI 依赖注入

Spring5依赖注入(DI)

DI依赖注入

Spring-IOC学习笔记-03DI依赖注入

大话DI依赖注入+IOC控制反转 之 定义

ASP.NET Core 依赖注入(DI)