依赖注入和控制反转一个意思,都是讲由原来主动地new一个对象变成能够被动地获取对象。
依赖注入有如下三种方式
设置注入:IoC容器使用setter方法注入被依赖对象
构造注入:IoC容器使用构造器注入被依赖对象
接口注入:调用者实现特定的接口,并实现接口中特定的方法,而IoC容器会自动检测并调用这个特定的方法,从而完成依赖注入。
设置注入
Spring会根据bean元素里的子元素property里的name属性和value/ref属性来调用bean对象的对应的setter方法为Bean成员变量注入值。
value:当注入的值是标量或String类型时用value指定对应的字符串。Spring会自动转换成对应的实际类型。
ref:当注入的值是Spring容器中的Bean对象时,用ref指定该Bean元素的id。
<bean id="chinese" class="com.lyx.service.Chinese">
<property name="axe" ref="steelAxe"/>
</bean>
<bean id="stoneAxe" class="com.lyx.service.StoneAxe"/>
<bean id="steelAxe" class="com.lyx.service.SteelAxe"/>
相当于
Chinese c = new com.lyx.service.Chinese();
c.setAxe(new com.lyx.service.SteelAxe());
构造注入
就是创建Bean对象时使用带参数的构造器,通过带参数的构造器完成成员变量初始化。
用N个bean子元素的元素 constructor-arg 为带N个参数的构造器传参。
constructor-arg中属性:
value/ref:参数值,必须指定。
index:手动指定参数排序(从0开始),如果不指定则按constructor-arg元素添加顺序传参。
type:参数类型,用于确定参数类型,可不指定。但有时在选择构造器的时候需要指定。因为对Spring选择构造器时所有的value都是字符串类型,这可能导致Spring选错构造器。
<bean id="chinese" class="com.lyx.service.Chinese">
<property name="axe" ref="steelAxe"/>
</bean>
<bean id="stoneAxe" class="com.lyx.service.StoneAxe"/>
<bean id="steelAxe" class="com.lyx.service.SteelAxe">
<constructor-arg value="深灰色" />
<constructor-arg value="重"/>
</bean>