依赖注入
依赖注入本质上和控制反转表示一个概念,当某个角色如Java实例,需要另一个角色如另一个Java实例的协助时,在传统的程序设计中,通常由调用者来创建被调用者的实例。但Spring中,创建被调用者的工作不在由调用者完成,而是由IOC容器来完成,所以称之为控制反转,然后注入调用者,所以称作依赖注入。
比如人和斧子的关系,原始社会里需要斧子的人只能自己去创造一把斧子;工厂出现后,斧子不再由需要斧子的人生产,而是在工厂里生产出来了,需要斧子的人找到工厂,购买斧子,不需要关心斧子的制造过程。到Spring就是按需分配,需要斧子的人不需要找到工厂,只需要发出一个需要斧子的指令,斧子就会出现在他面前,即依赖注入。
IOC容器主要有两种注入,即构造器注入和Setter注入。
构造器注入
构造器注入通过调用带参数的构造器来实现,每个参数代表着一个依赖。
public class Chinese implements Person{
private Axe axe;
public Chinese(){
super();
}
public Chinese(Axe axe){
super();
this.axe = axe;
}
@Override
public void useAxe{
System.out.println(axe.chop());
}
}
该代码中,调用者Chinese不用创建Axe实例,使用一个构造器准备接收Axe实例。
使用配置文件描述依赖关系:
<bean id="stoneAxe" class="org.be.spring.ch01.di.StoneAxe"></bean>
<bean id="steelAxe" class="org.be.spring.ch01.di.SteelAxe"></bean>
<bean id="chiness" class="org.bd.spring.ch01.di.Chinese">
<constructor-arg index="0" ref="stoneAxe"></constructor-arg>
</bean>
第三行定义了之前的调用者,第四行采用构造器注入的方式将标识为stoneAxe的bean实例注入给标识为Chinese调用者实例。constructor-arg代表一个构造参数,index代表参数的位置。ref指定被注入bean的id。
Setter注入
不同:构造器是在实例化对象时将主对象依赖的对象作为参数传递给构造器。而Setter注入是在实例化完成之后调用Setter方法,要求主对象有无参构造器,且提供对用的Setter方法。
<bean id="chiness" class="org.bd.spring.ch01.di.Chinese">
<property name="axe" ref="stoneAxe"></property>
</bean>
使用id为stoneAxe的bean给Chinese实例的axe属性赋值。
依赖注入不仅仅支持将一个bean实例注入到另一个bean实例,换可以将基本数据类型、String类型、集合等类型注入到调用者bean实例中。代码就不贴了,无非是property中属性是name和value。
自动装配不说了。