Spring 学习笔记02

时间:2022-08-25 16:26:33

依赖注入

依赖注入的方式主要有两种,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 学习笔记02

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>

使用测试类运行:

Spring 学习笔记02

结果和set注入一致,构造注入和setter注入的主要区别在于:setter注入是先通过无参数的构造器创建一个Bean的实例,

然后调用对应的setter方法注入依赖关系,而构造器注入则直接调用有参数的构造器,当Bean实例创建完成后已经完成了

依赖关系的注入。