Spring构造注入的几种方式

前言

我们知道Spring的依赖注入的方式有setter注入,构造器注入。setter注入依赖于set方法进行属性值的注入,而构造器注入,依赖于构造方法进行属性值的注入。

构造注入和setter注入的区别

  • 构造注入 :通过构造函数将依赖对象注入到类中。在Spring框架中,这通常是通过在配置文件中使用<constructor-arg>标签或在注解中使用@Autowired在构造函数上实现的。当Spring容器创建类的实例时,它会使用提供的构造函数参数来初始化对象。
  • setter注入 :通过setter方法将依赖对象注入到类中。这通常是在对象创建后,通过调用对象的setter方法来完成的。在Spring框架中,可以使用<property>标签或在setter方法上使用@Autowired注解来实现setter注入。

setter注入的实例很多,这里不具体说明,主要介绍一下构造器注入的几种方式

构造器注入

案例准备(Setter注入)

添加依赖,这里使用的spring5

XML 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

准备Dao和依赖它的Service层

准备spring.xml的配置文件

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="testDao" class="com.csx.spring.dao.impl.TestDaoImpl"/>
    <bean id="testService" class="com.csx.spring.service.impl.TestServiceImpl">
        <property name="testDao" ref="testDao"/>
    </bean>


</beans>

以上是使用setter方法实现依赖注入的基本方式

单元测试

效果演示

构造器注入案例改写

方式一:

修改TestServiceImpl

添加两个构造方法,一个是无参构造(必须存在,给spring创建对象使用),带有属性参数的构造方法,进行依赖注入使用。

java 复制代码
public class TestServiceImpl implements TestService {
    private TestDao testDao;


    public TestServiceImpl(){

    }
    public  TestServiceImpl(TestDao testDao){
        this.testDao=testDao;
    }
    @Override
    public void testService() {
        testDao.test();
        System.out.println("testService");
    }
}

修改spring.xml

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="testDao" class="com.csx.spring.dao.impl.TestDaoImpl"/>

    <bean id="testService" class="com.csx.spring.service.impl.TestServiceImpl">
        <constructor-arg name="testDao" ref="testDao"/>
    </bean>


</beans>

方式二:

  • 构造器注入,name的值与构造方法的参数名称一致,这导致构造注入的耦合度较高
  • 以上是标准的构造器注入,但是存在问题(存在多个参数时会导致一些问题,紧耦合的问题)
  • 出现了一个问题:一旦更改了构造方法中的参数名,配置文件就会出错,这意味着代码和配置文件是一个紧耦合的状态。
  • 解决方案:按照类型注入

方式三:

方式二,虽然可以减少一部分耦合的情况,但是这种方式,不能解决出现多个相同类型的参数情况.

方式三:按照索引位置注入

索引从0开始,依次加1

总结

  • 构造注入:通常用于注入不可变的依赖对象。由于依赖是在对象创建时通过构造函数注入的,因此一旦对象被创建,它的依赖就不能被更改。
  • setter注入:通常用于注入可变的依赖对象。由于依赖是通过setter方法注入的,因此可以在对象创建后随时更改其依赖。
相关推荐
geovindu8 分钟前
CSharp: Iterative Algorithms
开发语言·后端·算法·c#·.net·迭代算法
早点睡啊Y23 分钟前
深入学LangChain官方文档:Observability 与 Studio——先看清 Agent 到底做了什么
java·数据库·langchain
雨落在了我的手上25 分钟前
Java数据结构(六):链表的介绍
java·开发语言·数据结构
雪隐31 分钟前
AI股票小助手10-我用代码管住自己的手:一个普通人的市场观察笔记
前端·人工智能·后端
独隅33 分钟前
DevEco Code Plan+Build 双 Agent 协同开发效率实测
java·开发语言
艾斯特_1 小时前
混合检索与重排:提升召回与排序质量
后端·python·ai
Ai拆代码的曹操1 小时前
RocketMQ 消息堆积排查实战:从 20 个消费者线程卡死到 rebalance 死亡螺旋
后端·rocketmq
吃饱了得干活2 小时前
@Transactional 又失效了?把这 8 个坑全填了!
java·后端·spring
颜进强2 小时前
从零搭建私人 RAG 知识库:让项目决策真正“可检索、可追溯”
前端·后端·ai编程
颜进强2 小时前
Embedding 模型介绍:热门模型对比与应用场景
前端·后端·ai编程