文章目录
- 依赖注入方式
前言
DI是学习Spring必不可少的一部分,接下来对于DI的知识我主要讲解的是注入方式。
一、什么是DI?
答:DI是依赖注入(Dependency Injection)的缩写。DI是一种设计模式,用于减少代码之间的耦合度,从而提高代码的可复用性、可测试性和可维护性。在DI中,对象的依赖关系不再由对象本身负责管理和实例化,而是由外部容器注入。这样,各个对象之间的耦合度就相对降低了,使得代码更加灵活、扩展性更强
二、依赖注入方式
1.setter注入
1. 引用类型
步骤一:声明属性并提供setter方法:
在service层接口实现类(BookServiceImpl)中声明dao层(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();
}
}
步骤二:配置文件中进行注入配置:
在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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<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>
</beans>
总结:setter引用类型注入使用:使用的是<property name="" ref=""/>进行注入(在配置文件中编写)
2. 简单类型:
步骤一:声明属性并提供setter方法:
在service层接口实现类(BookServiceImpl)中声明dao层(UserDao)属性,并提供setter方法:
public class BookDaoImpl implements BookDao {
private String spring;
private int mybatis;
public void spring(int spring) {
this.spring = spring;
}
public void mybatis(String mybatis) {
this.mybatis = mybatis;
}
public void save() {
System.out.println("book dao save ..."+spring+","+mybatis);
}
}
value
步骤二:配置文件中进行注入配置
在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="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="spring" value="good"/>
<property name="mybatis" 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>
</beans>
value: 后面跟的是简单数据类型,参数类型,Spring会自动转换,但是不可以写成
<property name="mybatis" value="abc"/>
总结:setter简单类型注入使用:<property name="" value="">进行注入(在配置文件中编写)
2.构造器注入
1. 引用类型
步骤一:删除setter方法并提供构造方法:
在service层实现类(BookServiceImpl)中将dao层的setter方法删除,并添加带有dao参数的构造方法
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();
}
}
步骤二:配置文件中进行配置构造方式注入:
<?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>
标签<constructor-arg>中:
name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。
ref属性指向的是spring的IOC容器中其他bean对象。
总结:构造器引用类型
<bean ...>
<constructor-arg name="" index="" type="" ref=""/>
</bean>
2.1.1 构造器注入多个引用数据类型
步骤一:提供多个属性的构造函数:
在service层实现类(BookServiceImpl)声明dao层(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();
}
}
步骤二: 配置文件中配置多参数注入
<?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="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>
</beans>
2. 多个简单类型
步骤一:添加多个简单属性并提供构造方法:
修改dao层实现类(BookDaoImpl),添加构造方法:
public class BookDaoImpl implements BookDao {
private String spring;
private int mybatis;
public BookDaoImpl(String spring, int mybatis) {
this.spring = spring;
this.mybatis = mybatis;
}
public void save() {
System.out.println("book dao save ..."+spring+","+mybatis);
}
}
步骤二:配置完成多个属性构造器注入:
<?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">
<constructor-arg name="spring" value="good"/>
<constructor-arg name="mybatis" 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>
</beans>
注意:两个<contructor-arg>
的配置顺序可以任意
总结:构造器简单类型注入
<bean ...>
<constructor-arg name="" index="" type="" value=""/>
</bean>
总结
以上就是DI(依赖注入的方式),非常繁琐麻烦,下一节将简化依赖注入,感谢大家阅读,有不足的地方敬请指出。