1 组件(Bean)依赖注入配置(DI)
-
目标
通过配置文件,实现IoC容器中Bean之间的引用(依赖注入DI配置)。
主要涉及注入场景:基于构造函数的依赖注入和基于 Setter 的依赖注入。
-
思路
1.1 基于构造函数的依赖注入(单个构造参数)
-
介绍
基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项。
下面的示例演示一个只能通过构造函数注入进行依赖项注入的类!
-
准备组件类
public class UserDao {
}
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
- 编写配置文件
文件:resources/spring-02.xml
constructor-arg标签:可以引用构造参数 ref引用其他bean的标识
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 被引用类bean声明 -->
<bean id="userDao" class="com.lx.ioc_02.UserDao"></bean>
<!-- 引用类bean声明 -->
<bean id="userService" class="com.lx.ioc_02.UserService">
<!-- 构造函数引用 -->
<constructor-arg ref="userDao"></constructor-arg>
</bean>
</beans>
1.2 基于构造函数的依赖注入(多构造参数解析)
-
介绍
基于构造函数的 DI 是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项。
下面的示例演示通过构造函数注入多个参数,参数包含其他bean和基本数据类型!
-
准备组件类
public class UserDao {
}
public class UserService {
private UserDao userDao;
private int age;
private String name;
public UserService(int age , String name ,UserDao userDao) {
this.userDao = userDao;
this.age = age;
this.name = name;
}
}
- 编写配置文件
constructor-arg标签:指定构造参数和对应的值
constructor-arg标签:name属性指定参数名、index属性指定参数角标、value属性指定普通属性值
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.lx.ioc_02.UserDao"></bean>
<!-- 构造参数的顺序填写值,value 直接赋值,ref 引用其它bean-->
<bean id="userService1" class="com.lx.ioc_02.UserService">
<constructor-arg value="18"></constructor-arg>
<constructor-arg value="张三"></constructor-arg>
<constructor-arg ref="userDao"></constructor-arg>
</bean>
<!-- 构造参数的名称填写,不用考虑顺序 name = 构造参数的名字【推荐】-->
<bean id="userService2" class="com.lx.ioc_02.UserService">
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg ref="userDao"></constructor-arg>
</bean>
<!-- 构造参数的参数的下标填写,不用考虑顺序 index = 构造参数的下标,从左到右,从0开始 -->
<bean id="userService2" class="com.lx.ioc_02.UserService">
<constructor-arg index="0" value="18"></constructor-arg>
<constructor-arg index="1" value="张三"></constructor-arg>
<constructor-arg index="2" ref="userDao"></constructor-arg>
</bean>
</beans>
2 基于Setter方法依赖注入
-
介绍
开发中,除了构造函数注入(DI)更多的使用的Setter方法进行注入!
下面的示例演示一个只能使用纯 setter 注入进行依赖项注入的类。
-
准备组件类
public class MovieFinder {
}
public class SimpleMovieLister {
private MovieFinder movieFinder;
private String movieName;
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
public void setMovieName(String movieName){
this.movieName = movieName;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
- 编写配置文件
property标签: 可以给setter方法对应的属性赋值
property 标签: name属性代表set方法标识、ref代表引用bean的标识id、value属性代表基本属性值
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="movieFinder" class="com.lx.ioc_02.MovieFinder"></bean>
<bean id="simpleMovieLister" class="com.lx.ioc_02.SimpleMovieLister">
<!-- name:setter方法的 去set和首字母小写的值,调用set方法的名-->
<!-- value:直接属性值-->
<!-- ref:其他bean的id-->
<property name="movieName" value="张三"></property>
<property name="movieFinder" ref="movieFinder"/>
</bean>
</beans>
3 总结
依赖注入(DI)包含引用类型和基本数据类型,同时注入的方式也有多种!主流的注入方式为setter方法注入和构造函数注入
需要特别注意:引用其他bean,使用ref属性。直接注入基本类型值,使用value属性。