【Spring学习笔记】3:依赖注入(DI),控制反转(IoC),配置依赖注入,内部Bean,集合注入,空注入

xiaoxiao2021-02-28  61

依赖注入

依赖指的是一个类中使用了属性,这些属性就是这个类的依赖。依赖可以是对象也可以是值。

依赖注入(DI)就是将一个类的依赖传递给它,一般“依赖”说的都是依赖的对象。

下面这种方式就不是依赖注入的,而是由类自己去把自己的成员实例化了。

public class A{ private B b; public A(){ b=new B(); } }

下面这种方式就是依赖注入的,而且是通过构造器注入的。对象b的实例化显然在类A的外部,通过注入传递了进来。

public class A{ private B b; public A(B b){ this.b=b; } }

控制反转

控制反转(IoC)就是将创建对象的工作交给IoC容器框架,而不是自己来做。它是建立在DI之上的(一说DI即IoC),IoC容器实例化了要注入的对象,通过DI注入给需要这个对象的对象中,由IoC框架来管理DI和做DI。

Spring中就是通过配置<beans .../>的xml文件和框架提供的一系列接口来实现IoC的。

显然IoC能提高可重用性,解耦合,使系统更易于扩展。

DI的配置

基于构造器的DI

在<bean .../>下使用<constructor-arg .../>来配置基于构造器的DI。

如使用另一个bean的id即使用了其创建的对象作为自己构造器中注入的一个形参:

<constructor-arg ref="另一个bean的id"/>

一个constructor-arg只能配出构造器中注入的一个参数,当构造器中要传入多个参数时需要按形参表顺序一个一个配:

<constructor-arg ref="..."/> <constructor-arg ref="..."/>

所以在属性的注入有顺序要求时,构造器DI会比setter DI有优势。

传递值类型的参数时可以指定类型:

... <constructor-arg type="java.lang.String" value="垃圾刘知昊"/> ...

也可以显式指定参数位置而不指定type:

<constructor-arg index="0" value="垃圾傻逼"/> <constructor-arg index="1" value="垃圾LZH"/> ...

基于setter的DI

在<bean .../>下使用<property... />来配置基于setter的DI。一个<property... />的配置就相当于实例化外面这个bean之前要调用一次对应的setter。

传值类型:

<property name="值类型属性名" value="要传进来的值"/>

传引用类型:

<property name="引用类型属性名" ref="另一个bean的id"/>

简洁的p-namespace混合形式:

<bean id="..." class="..." p:值类型属性名="要传进来的值" p:引用类型属性名-ref="另一个bean的id"/> </bean>

内部Bean

内部Bean配置在其它Bean的某些属性中,其作用范围就仅限外层属性。如果一个类只被某个bean使用,可以考虑配置在这个bean里面,简洁明了。

如:

<bean id="..." class="..."> <property name="sbLzh"> <bean id="sbLzh" class="myBean.Student"/> </property> </bean>

集合注入

List,Set,Map,Properties接口类型的属性,在注入时使用特殊的集合注入。即对于有name属性的<property .../>打开为双标签,使用<list>,<set>,<map>和<props>双标签包含值来配置。

集合里存的是值类型

配置List:

<property name="List属性名"> <list> <value>...</value> ... </list> </property>

配置Set:

<property name="Set属性名"> <set> <value>...</value> ... </set> </property>

配置Map:

<property name="Map属性名"> <map> <entry key="..." value="..."/> ... </map> </property>

配置Properties:

<property name="Properties属性名"> <props> <prop key="...">...</prop> ... </props> </property>

集合里存的是引用类型

配置List:

<property name="List属性名"> <list> <ref bean="另一个bean的id"/> ... </list> </property>

配置Set:

<property name="Set属性名"> <set> <ref bean="另一个bean的id"/> ... </set> </property>

配置Map:

<property name="Map属性名"> <map> <entry key="..." value-ref="另一个bean的id"/> ... </map> </property>

空注入

空串注入:

<property name="字符串类型属性名" value=""/>

null注入:

<property name="引用类型属性名"><null/></property>
转载请注明原文地址: https://www.6miu.com/read-2629013.html

最新回复(0)