依赖注入
依赖注入的方式主要有两种,setter注入和构造器注入
1.setter注入
setter注入指的是通过成员变量的setter方法来注入被依赖的对象
首先定义两个接口:
public interface People {
void drinkWater();
}
public interface Water {
String makeDrink();
}
定义实现类
public class Tea implements Water{
public String makeDrink() {
return "开始泡茶";
}
}
public class Chinese implements People{
private Water water;
public void setWater(Water water) {
this.water = water;
}
public void drinkWater() {
System.out.println(water.makeDrink());
System.out.println("中国人喜欢喝茶");
}
}
配置文件中配置并注入bean
<bean id="chinese" class="com.huan.example.Chinese">
<property name="water" ref="Tea"></property>
</bean>
<bean id="Tea" class="com.huan.example.Tea">
</bean>
测试:
public class TestPeople {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Chinese chinese = ac.getBean("chinese", Chinese.class);
chinese.drinkWater();
}
}
结果:
Spring会自动检测<bean>元素中的<property>标签,在Spring调用默认的构造器创建Bean的实例之后会立刻调用对应的setter方法为Bean的
成员变量注入值。
2.构造注入
构造注入值的是在利用类的构造器构造实例时,对依赖的值进行注入,标签元素为<construct-arg../>
更改上面的Chinese实现类的代码以及配置文件
public class Chinese implements People{
private Water water;
public Chinese(Water water){
this.water = water;
}
// public void setWater(Water water) {
// this.water = water;
// }
public void drinkWater() {
System.out.println(water.makeDrink());
System.out.println("中国人喜欢喝茶");
}
}
<bean id="chinese" class="com.huan.example.Chinese">
<!-- <property name="water" ref="Tea"></property> -->
<!-- 其他属性 index 代表构造器第几个参数 type 指定参数的类型-->
<constructor-arg ref="Tea" />
</bean>
<bean id="Tea" class="com.huan.example.Tea">
</bean>
使用测试类运行:
结果和set注入一致,构造注入和setter注入的主要区别在于:setter注入是先通过无参数的构造器创建一个Bean的实例,
然后调用对应的setter方法注入依赖关系,而构造器注入则直接调用有参数的构造器,当Bean实例创建完成后已经完成了
依赖关系的注入。