接下来介绍模块DI依赖注入
,首先来介绍下Spring中有哪些注入方式?我们先来思考:
- 向一个类中传递数据的方式有几种?
- 普通方法(set方法)
- 构造方法
- 依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?
- 引用类型
- 简单类型(基本数据类型与String)
Spring就是基于上面这些知识点,为我们提供了两种注入方式,分别是:
- setter注入
- 简单类型
- 引用类型
- 构造器注入
- 简单类型
- 引用类型
依赖注入的方式已经介绍完,接下来介绍setter注入。
1. setter注入
- 对于setter方式注入引用类型的方式之前已经介绍过,快速回顾下:
- 在bean中定义引用类型属性,并提供可访问的set方法
public class UserServiceImpl implements UserService {
private UserDao UserDao;
public void setUserDao(UserDao UserDao) {
this.UserDao = UserDao;
}
}
- 配置中使用property标签ref属性注入引用类型对象
<bean id="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
<property name="userDao" ref="userDao" />
</bean>
2. 环境准备
为了更好的学习下面内容,我们依旧准备一个新环境:
- 创建一个Maven项目
- pom.xml添加依赖
- resources下添加spring的配置文件
项目的结构如下:
(1)项目中添加UserDao、UserDaoImpl、CityDao、CityDaoImpl、UserService和UserServiceImpl类
public interface UserDao {
public void selectInfo();
}
public class UserDaoImpl implements UserDao {
public void selectInfo() {
System.out.println("UserDao selectInfo, running ,,,,,,,");
}
}
public interface CityDao {
public void fromCity();
}
public class CityDaoImpl implements CityDao {
public void fromCity() {
System.out.println("CityDao fromCity, running ......");
}
}
public interface UserService {
public void selectInfo();
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void selectInfo() {
System.out.println("UserService selectInfo, running ......");
userDao.selectInfo();
}
}
(2)resources下提供spring的配置文件
<?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.dcxuexi.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
<property name="userDao" ref="userDao" />
</bean>
</beans>
(3)编写SpringSetter运行类,加载Spring的IOC容器,并从中获取对应的bean对象
public class SpringSetter {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
userService.selectInfo();
}
}
接下来,在上面这个环境中来完成setter注入。
3. 注入引用数据类型
需求:在UserServiceImpl对象中注入cityDao
1.在UserServiceImpl中声明cityDao属性
2.为cityDao属性提供setter方法
3.在配置文件中使用property标签注入
步骤1:声明属性并提供setter方法
在UserServiceImpl中声明cityDao属性,并提供setter方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
private CityDao cityDao;
public void setCityDao(CityDao cityDao) {
this.cityDao = cityDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void selectInfo() {
System.out.println("UserService selectInfo, running ......");
userDao.selectInfo();
cityDao.fromCity();
}
}
步骤2:配置文件中进行注入配置
在applicationContext.xml配置文件中使用property标签注入
<?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.dcxuexi.dao.impl.UserDaoImpl" />
<bean id="cityDao" class="com.dcxuexi.dao.impl.CityDaoImpl" />
<bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
<property name="userDao" ref="userDao" />
<property name="cityDao" ref="cityDao" />
</bean>
</beans>
步骤3:运行程序
运行SpringSetter类,查看结果,说明cityDao已经成功注入。
4. 注入简单数据类型
需求:给UserDaoImpl注入一些简单数据类型的数据
参考引用数据类型的注入,我们可以推出具体的步骤为:
1.在UserDaoImpl类中声明对应的简单数据类型的属性
2.为这些属性提供对应的setter方法
3.在applicationContext.xml中配置
思考:
引用类型使用的是<property name="" ref=""/>
,简单数据类型还是使用ref么?
ref是指向Spring的IOC容器中的另一个bean对象的,对于简单数据类型,没有对应的bean对象,该如何配置?
步骤1:声明属性并提供setter方法
在UserDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法
public class UserDaoImpl implements UserDao {
private String userName;
private Integer age;
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(Integer age) {
this.age = age;
}
public void selectInfo() {
System.out.println("UserDao selectInfo, running ,,,,,,,");
System.out.println("userName = " + userName + " ; age = " + age + " .");
}
}
步骤2:配置文件中进行注入配置
在applicationContext.xml配置文件中使用property标签注入
<?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.dcxuexi.dao.impl.UserDaoImpl" >
<property name="userName" value="xiaochuang" />
<property name="age" value="20" />
</bean>
<bean id="cityDao" class="com.dcxuexi.dao.impl.CityDaoImpl" />
<bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
<property name="userDao" ref="userDao" />
<property name="cityDao" ref="cityDao" />
</bean>
</beans>
说明:
value:后面跟的是简单数据类型,对于参数类型,Spring在注入的时候会自动转换,但是不能写成
<property name="age" value="temp" />
这样的话,spring在将temp
转换成int类型的时候就会报错。
步骤3:运行程序
运行SpringSetter类,查看结果,说明userDao已经成功注入。
注意: 两个property注入标签的顺序可以任意。
对于setter注入方式的基本使用就已经介绍完了,
- 对于引用数据类型使用的是
<property name="" ref=""/>
- 对于简单数据类型使用的是
<property name="" value=""/>
项目代码