接过上一讲,我们接着讲述DI依赖注入 (依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程)
1.DI依赖注入
向一个类中传递数据的方式有几种?
- 普通方法(set方法)
- 构造方法
1 setter注入:
对于setter方式注入引用类型的方式之前已经学习过,快速回顾下:
1.在bean中定义引用类型属性,并提供可访问的set方法
public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; }
2.配置中使用property标签ref属性注入引用类型对象
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> </bean> <bean id="bookDao" class="com.itheima.dao.imipl.BookDaoImpl"/>
3.编写AppForDISet运行类,加载Spring的IOC容器,并从中获取对应的bean对象
public class AppForDISet { public static void main( String[] args ) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); BookService bookService = (BookService) ctx.getBean("bookService"); bookService.save(); } }
2 注入简单数据类型
思考:
引用类型使用的是 <property name="" ref=""/> ,简单数据类型还是使用ref么?
ref是指向Spring的IOC容器中的另一个bean对象的,对于简单数据类型,没有对应的bean对象,该如何配置?步骤1:声明属性并提供setter方法
在BookDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法
private String databaseName; private int connectionNum; public void setConnectionNum(int connectionNum) { this.connectionNum = connectionNum; } public void setDatabaseName(String databaseName) { this.databaseName = databaseName; } public void save() { System.out.println("book dao save..."+databaseName+","+connectionNum); }
步骤2:配置文件中进行注入配置
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"> <property name="databaseName" value="mysql"/> <property name="connectionNum" value="10"/> </bean> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> <property name="userDao" ref="userDao"/> </bean>
<property name="databaseName" value="mysql"/> <property name="connectionNum" value="10"/>
value:后面跟的是简单数据类型,对于参数类型,Spring在注入的时候会自动转换
2 构造器注入
步骤1:删除setter方法并提供构造方法
在BookServiceImpl类中将bookDao的setter方法删除掉,并添加带有bookDao参数的构造方法public class BookServiceImpl implements BookService{ private BookDao bookDao; public BookServiceImpl(BookDao bookDao) { this.bookDao = bookDao; } }
步骤2:配置文件中进行配置构造方式注入在applicationContext.xml 中配置,其中文件增加配置constructor配置。<?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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="bookDao"/> </bean> </beans>
说明: 标签中name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。 ref属性指向的是spring的IOC容器中其他bean对象构造器注入多个简单数据类型步骤1: 添加多个简单属性并提供构造方法修改BookDaoImpl 类,添加构造方法1.首先我们创建几个数据的类型数据,让后配置xml文件,来导入数据类型public class BookDaoImpl implements BookDao { private String databaseName; private int connectionNum; public BookDaoImpl(String databaseName, int connectionNum) { this.databaseName = databaseName; this.connectionNum = connectionNum; } }
步骤2: 配置完成多个属性构造器注入在applicationContext.xml 中进行注入配置<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"> <constructor-arg name="databaseName" value="mysql"/> <constructor-arg name="connectionNum" value="666"/> </bean> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="bookDao"/> <constructor-arg name="userDao" ref="userDao"/> </bean>
2.自动配置
(1)将<property>标签删除(2)在<bean>标签中添加autowire属性首先来实现按照类型注入的配置<?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 class="com.itheima.dao.impl.BookDaoImpl"/> <!--autowire属性:开启自动装配,通常使用按类型装配--> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/> </beans>
注意事项 :需要注入属性的类中对应属性的setter 方法不能省略被注入的对象必须要被Spring 的 IOC 容器管理按照类型在Spring 的 IOC 容器中如果找到多个对象,会报 NoUniqueBeanDefinitionException 一个类型在IOC 中有多个对象,还想要注入成功,这个时候就需要按照名称注入,配置方式为 :<?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 class="com.itheima.dao.impl.BookDaoImpl"/> <!--autowire属性:开启自动装配,通常使用按类型装配--> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/> </beans>