spring(三):如何通过配置文件实现依赖注入(DI)?set方法注入和构造器方法注入两种方式代码演示,两种注入方式的注意事项以及本质区别。
目录
1、代码总体演
2、set注入代码演示
3、构造方法注入
方法一:根据index索引来指定构造器参数下标
方法二:根据构造器的参数名字来配置传入的参数
方法三:不指定下标以及参数名
4、set注入和构造注入本质区别
本文章主要讲解Spring如何通过配置文件实现依赖注入(DI),通过代码演示详细介绍了set方法注入和构造器方法注入两种方式,两种注入方式的注意事项以及本质区别。
1、代码总体演示
我们定义了3个接口,对应3个实现类。其中UserServiceImpl类同时调用了StudentDao接口、UserDao接口里面被实现的方法,代码如下:
UserService接口以及实现类UserServiceImpl
public interface UserService {
String deleteMan(String name);
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
private StudentDao studentDao;
public UserServiceImpl(UserDao myParamUser,StudentDao myParamStudent) {
this.userDao = myParamUser;
this.studentDao = myParamStudent;
}
@Override
public String deleteMan(String name) {
System.out.println("准备调用删除的dao层");
userDao.delete();
studentDao.deleleStudent();
return name + "用户被删除了!";
}
}
UserDao接口以及实现类UserDaoImpl
public interface UserDao {
void delete();
}
public class UserDaoImpl implements UserDao {
@Override
public void delete() {
System.out.println( "正在删除用户数据");
}
}
StudentDao接口以及实现类StudentDaoImpl
public interface StudentDao {
void deleleStudent();
}
public class StudentDaoImpl implements StudentDao {
@Override
public void deleleStudent() {
System.out.println("学生信息被删除了");
}
}
2、set注入代码演示
set方法注入,那一定要写set方法
set注入方法中,我们的set方法是可以自定义命名的,配置的时候要把自定义set方法的方法名和配置的name对应上。
配置文件中的name命名规范:自定义的set方法名去掉set,剩下的单词首字母小写。
<?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="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
<bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>
<bean id="userServieImplDao" class="com.linctSpring6.Service.impl.UserServiceImpl">
<property name="userDao" ref="userDaoImplBean"/>
<property name="studentDao" ref="StudentDaoBean"/>
</bean>
</beans>
在哪个bean中注入,写到哪个bean标签中。
配置property标签
ref指定需要注入的bean的id
name指set方法的方法名,例如本案例是setUserDao(去掉set这三个字母,剩下的单词首字母小写)
我们写一个测试方法来测试set方法注入bean
@Test
public void testDISet(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
UserServiceImpl userServieImplDao = applicationContext.getBean("userServieImplDao", UserServiceImpl.class);
userServieImplDao.deleteMan("qq");
}
可以看到我们控制台的打印,能完美实现set方法注入
注意:set方法注入一定必须要写无参构造方法
3、构造方法注入
构造方法注入那一定就要先写一个构造方法
方法一:根据index索引来指定构造器参数下标
根据索引下标指定构造器参数的传入
<?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="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
<bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>
<bean id="userServieImplBean" class="com.linctSpring6.Service.impl.UserServiceImpl">
<!--使用构造器的方法实现bean注入-->
<!--根据索引下标指定构造器参数的传入-->
<constructor-arg index="0" ref="userDaoImplBean"></constructor-arg>
<constructor-arg index="1" ref="StudentDaoBean"></constructor-arg>
</bean>
<bean id="nowTime" class="java.util.Date"></bean>
</beans>
方法二:根据构造器的参数名字来配置传入的参数
根据构造器的参数名字来配置传入的参数,参数名字自己定义
<?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="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
<bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>
<bean id="userServieImplBean" class="com.linctSpring6.Service.impl.UserServiceImpl">
<!--使用构造器的方法实现bean注入-->
<!--根据构造器的参数名字来配置传入的参数,参数名字自己定义-->
<constructor-arg name="myParamUser" ref="userDaoImplBean"></constructor-arg>
<constructor-arg name="myParamStudent" ref="StudentDaoBean"></constructor-arg>
</bean>
<bean id="nowTime" class="java.util.Date"></bean>
</beans>
方法三:不指定下标以及参数名
让spring自己根据类型匹配判断是构造器的第几个参数
spring会自动根据类型来判断把ref注入给哪个参数
<?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="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
<bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>
<bean id="userServieImplBean" class="com.linctSpring6.Service.impl.UserServiceImpl">
<!--不指定下标以及参数名,让spring自己根据类型匹配判断是构造器的第几个参数-->
<!--spring会自动根据类型来判断把ref注入给哪个参数-->
<constructor-arg ref="StudentDaoBean"></constructor-arg>
<constructor-arg ref="userDaoImplBean"></constructor-arg>
</bean>
<bean id="nowTime" class="java.util.Date"></bean>
</beans>
我们写一个测试方法来测试以上三种bean的注入配置
@Test
public void testDIByConstruct(){
//这行代码只要一执行,相当于启动了spring容器,解析springConfig.xml文件,并且实例化所有的bean对象,放到spring容器当中。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
UserService userServieImplBean = applicationContext.getBean("userServieImplBean", UserService.class);
userServieImplBean.deleteMan("小林");
}
可以看到我们控制台的打印,能完美实现构造器的注入
注意:构造方法注入可以不写无参构造方法
4、set注入和构造注入本质区别
set注入是在创建完对象之后,再调用set方法才注入的(所以需要无参构造方法,因为创建对象默认就是通过反射调用无参构造方法创建的)
构造注入是在创建对象的同时注入的,因为创建对象的本质就是调用构造方法(所以构造注入在创建对象时调用的是有参构造方法并且同时注入配置的bean,也能得出为什么构造注入不需要无参构造方法)
以上就是我对spring实现依赖注入的2种方法(set注入、构造器注入)的理解啦,希望能帮到大家,有问题的地方欢迎大家一起讨论!
后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤