目录
前言
在上一章,我们学习了,Bean的生命周期(添加初始化和销毁方法,配置生命周期)以及close关闭容器,和注册钩子关闭容器,详细可见:第四章 spring-CSDN博客
这一章,我们主要讲解DI的相关内容;
首先,向一个类中传输数据主要是:
1,普通方法(set方法)
2,构造方法
依赖注入描述了在容器中建立
bean
与
bean
之间的依赖关系的过程,假设在
bean
运行需要的是数字或 字符串,我们传输数据:
1,引用类型
2,简单类型(基本数据类型与String)
Spring就是基于上面知识点,为我们提供了:
1,setter注入
1.简单类型
2.引用类型
2,构造器注入
1.简单类型
2.引用类型
5.1setter注入
5.1.1 环境准备
为了更好的学习下面内容,我们依旧准备一个新环境
:
创建一个Maven
项目;
pom.xml添加依赖;
resources下添加
spring
的配置文件;
具体前面有详细操作:
![](https://img-blog.csdnimg.cn/direct/0249eefb5f6f4229b05911afa11e4454.png)
(1)
项目中添加
BookDao
、
BookDaoImpl
、
UserDao
、
UserDaoImpl
、
BookService和
BookServiceImpl类
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
public interface UserDao {
public void save();
}
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("UserDao save...");
}
}
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("BookService save...");
bookDao.save();
}
}
(2)resources
下提供
spring
的配置文件
![](https://img-blog.csdnimg.cn/direct/a5731626006a40a1b4db91d01d02e968.png)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bookDao" class="com.hw.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.hw.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
(3)编写App运行类,加载Spring的IOC容器,并从中获取对应的bean对象
public class App {
public static void main( String[] args ) {
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) context.getBean("bookService");
bookService.save();
}
}
5.1.2 注入引用数据类型
步骤1:声明属性并提供setter方法
在
BookServiceImpl
中声明
userDao
属性,并提供
setter
方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
userDao.save();
}
}
步骤2:配置文件中进行注入配置
在
applicationContext.xml
配置文件中使用
property
标签注入
![](https://img-blog.csdnimg.cn/direct/59be0940473f4f1cb6ffb9d2ce35bfa3.png)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bookDao" class="com.hw.dao.impl.BookDaoImpl"/>
<bean id="userDao" class="com.hw.dao.impl.UserDaoImpl"></bean>
<bean id="bookService" class="com.hw.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
步骤3:运行程序
运行App类,查看结果,说明userDao已经成功注入
5.1.3 注入简单数据类型
步骤1:声明属性并提供setter方法
在
BookDaoImpl
类中声明对应的简单数据类型的属性
,
并提供对应的
setter
方法
![](https://img-blog.csdnimg.cn/direct/7c7c9011bb284ff5bf417e5c9482cc4b.png)
public class BookDaoImpl implements BookDao {
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("BookDao save..."+databaseName+","+connectionNum);
}
}
步骤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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bookDao" class="com.hw.dao.impl.BookDaoImpl">
<property name="databaseName" value="mysql"/>
<property name="connectionNum" value="10"/>
</bean>
<bean id="userDao" class="com.hw.dao.impl.UserDaoImpl"/>
<bean id="bookService"
class="com.hw.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"/>
</bean>
</beans>
步骤3:运行程序
5.2 构造器注入
5.2.1 环境准备
构造器注入也就是构造方法注入,学习之前,还是先准备下环境
:
创建一个Maven
项目
pom.xml添加依赖
resources下添加
spring
的配置文件
这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下
:
![](https://img-blog.csdnimg.cn/direct/ebb522a30d1b49edb096fd950b580bae.png)
5.2.2 构造器注入引用数据类型
步骤1:删除setter方法并提供构造方法
在
BookServiceImpl
类中将
bookDao
的
setter
方法删除掉
,
并添加带有
bookDao
参数的构造方法
![](https://img-blog.csdnimg.cn/direct/833285751ed34bf7baa87fc36ec53087.png)
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
步骤2:配置文件中进行配置构造方式注入
在
applicationContext.xml
中配置
![](https://img-blog.csdnimg.cn/direct/fc525a13c1a64ba498696ba8f7998986.png)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bookDao" class="com.hw.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.hw.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
</bean>
</beans>
说明:标签中name属性对应的值为构造方法函数中方法形参的参数名,必须保持一直
ref属性指向是spring的IOC容器中其他bean对象
步骤3:运行程序
运行
App
类,查看结果,说明
bookDao
已经成功注入
![](https://img-blog.csdnimg.cn/direct/0ab37e3b3b8e447f8d4d1215448a96ea.png)
5.2.3 构造器注入多个引用数据类型
步骤1:提供多个属性的构造函数
在BookServiceImpl声明userDao并提供多个参数的构造函数
public class BookServiceImpl implements BookService{
private BookDao bookDao;
private UserDao userDao;
public BookServiceImpl(BookDao bookDao,UserDao userDao) {
this.bookDao = bookDao;
this.userDao = userDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
userDao.save();
}
}
步骤2:配置文件中配置多参数注入
在
applicationContext.xml
中配置注入
![](https://img-blog.csdnimg.cn/direct/3486162e8cdf40e2b32feca50a32e3c9.png)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bookDao" class="com.hw.dao.impl.BookDaoImpl"/>
<bean id="userDao" class="com.hw.dao.impl.UserDaoImpl"/>
<bean id="bookService" class="com.hw.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
</beans>
步骤3:运行程序
5.2.4 构造器注入多个简单数据类型
步骤1:添加多个简单属性并提供构造方法
修改
BookDaoImpl
类,添加构造方法
![](https://img-blog.csdnimg.cn/direct/4bf442d92acb4208b3048e8aa56d1ea6.png)
public class BookDaoImpl implements BookDao {
private String databaseName;
private int connectionNum;
public BookDaoImpl(String databaseName, int connectionNum) {
this.databaseName = databaseName;
this.connectionNum = connectionNum;
}
public void save() {
System.out.println("book dao save..."+databaseName+","+connectionNum);
}
}
步骤2:配置完成多个属性构造器注入
在applicationContext.xml中进行注入配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bookDao" class="com.hw.dao.impl.BookDaoImpl">
<constructor-arg name="databaseName" value="mysql"/>
<constructor-arg name="connectionNum" value="666"/>
</bean>
<bean id="userDao" class="com.hw.dao.impl.UserDaoImpl"/>
<bean id="bookService" class="com.hw.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
</beans>
步骤3:运行程序
这节,主要讲解了Spring的依赖注入的实现方式:
setter注入:
简单数据类型
引用数据类型
构造器注入
简单数据类型
引用数据类型
在依赖注入的方式选择上:
建议使用setter注入,第三方技术根据情况决定。