依赖指的是一个类中使用了属性,这些属性就是这个类的依赖。依赖可以是对象也可以是值。
依赖注入(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中就是通过配置
的xml文件和框架提供的一系列接口来实现IoC的。
显然IoC能提高可重用性,解耦合,使系统更易于扩展。
在
下使用
来配置基于构造器的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之前要调用一次对应的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 id="..." class="...">
<property name="sbLzh">
<bean id="sbLzh" class="myBean.Student"/>
property>
bean>
List
,Set
,Map
,Properties
接口类型的属性,在注入时使用特殊的集合注入。即对于有name属性的
打开为双标签,使用
,
,和
双标签包含值来配置。
配置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>