问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring依赖注入详解:set方法注入与构造器注入的对比与实践

创作时间:
作者:
@小白创作中心

Spring依赖注入详解:set方法注入与构造器注入的对比与实践

引用
CSDN
1.
https://blog.csdn.net/rainingCSDN/article/details/144517333

本文详细介绍了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>
![](https://wy-static.wenxiaobai.com/chat-rag-image/9911116946149571988)
    <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注入-->
        <!--根据索引下标指定构造器参数的传入-->
![](https://wy-static.wenxiaobai.com/chat-rag-image/6199077764596662626)
        <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注入、构造器注入)的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!

后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号