一、首先看下概念
依赖注入:曾用名控制反转(Inverse of Control,简称IoC,即一类调用一个接口的实现类,这个实现类由第三方决定)。
现在用名 Dependency Injection,简称DI。
二、依赖注入的几种方式
1、属性注入
通过setXxx()方法注入Bean的属性值或依赖对象。
属性命名规则--属性的前两个字母要么全部大写,要么全部小写,如:iC,aB这样的属性,spring容器启动会报异常。
2、构造函数注入
在Bean实例化的时候,注入属性值,在实例化后可使用。在注入时其中可细分为:
(1、)按类型匹配入参
如:public class Car{
...省略
public Car(string brand,double price){
this.brand = brand;
this.price = price;
}
}
注入的bean文件如下:
<bean id="car" class="com.baobao.ditype.Car">
<constructor-arg type="java.lang.String">
<value>红旗CA72</value>
<constructor-arg>
<constructor-arg type="double">
<value>20000</value>
</constructor-arg>
</bean>
(2、)按索引匹配入参
如:public class Car{
...省略
public Car(string brand,String corp,double price){
this.brand = brand;
this.corp = corp;
this.price = price;
}
}
配置文件如下:
<bean id="car" class="com.baobaotao.ditype.Car">
<--索引从0开始-->
<constructor-arg index="0" value="红旗CA72"/>
<constructor-arg index="1" value="中国一汽"/>
<constructor-arg index="2" value="2000"/>
</bean>
(3、)联合使用类型和索引匹配入参
如:public class Car{
...省略
public Car(string brand,String corp,double price){
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(string brand,String corp,int maxSpeed){
this.brand = brand;
this.corp = corp;
this.price = price;
}
}
(注:多构造时,单独使用类型注入或索引注入都不能确定为哪个构造赋值,第三个属性值是不同的,因此使用索引加类型联合确定具体的构造函数)
配置文件如下:
<bean id="car" class="com.baobaotao.Car">
<constructor-arg index="0" type="java.lang.String">
<value>红旗CA72</value>
</constructor>
<constructor-arg index="1" type="java.lang.String">
<value>中国一汽</value>
</constructor>
<constructor-arg index="2" type=“int">
<value>200</value>
</constructor>
</bean>
(4、通过自身类型反射匹配入参)
如:
public Boss(String name,Car car,Office office){
this.name=name;
this.car = car;
this.office=office;
}
配置文件如下:
<bean id="boss" class="com.baobaotao.ditype.Boss">
<!--这里没有设置type和index属性-->
<constructor-arg>
<value>John</value>
</constructor-arg>
<constructor-arg>
<ref bean="car"/>
</constructor-arg>
<constructor-arg>
<ref bean="office"/>
</constructor-arg>
</bean><bean id="car" class="com.baobaotao.ditype.Car"/>
<bean id="office" class="com.baobaotao.ditype.Office"/>