Spring注入

简介: Spring注入

3.1 什么是注入

注入(Injection)是指通过依赖注入(DI)方式,由容器动态地将某些对象的依赖关系注入到这些对象中。在Spring框架中,最常见的是通过构造函数setter 方法字段来进行依赖注入。

上面的文字太官方了,说的接地气点: 注入就是通过Spring⼯⼚及配置⽂件,为所创建对象的成员变量赋值.

3.1.1 为什么需要注入

通过编码的⽅式,为成员变量进⾏赋值,存在耦合,如下面这种方式:

stu.setId(1);
stu.setName("snow");

在 Spring 框架中,通过依赖注入,我们可以在配置文件或者通过注解的方式,明确地指定各个对象之间的依赖关系,然后由 Spring 容器来实现依赖的自动注入,从而简化了开发工作,提高了代码的可维护性和可扩展性。

3.1.2 如何进行注入

  1. 方式1:类的成员变量提供set get⽅法
  2. 方式2:配置spring的配置⽂件
<bean id="person" class="com.basic.Person">
    <property name="id">
        <value>10</value>
    </property>
    <property name="name">
        <value>露娜</value>
    </property>
</bean>

3.1.3 注入好处

解耦合

依赖注入的优势在于,它使得对象的创建和依赖关系的管理不再由对象自身来完成,而是交由容器来完成。这样做的好处是降低了对象之间的耦合度,提高了代码的灵活性和可测试性,同时也使得代码更加清晰和易于维护。


在Spring框架中,通过依赖注入,我们可以在配置文件或者通过注解的方式,明确地指定各个对象之间的依赖关系,然后由Spring容器来实现依赖的自动注入,从而简化了开发工作,提高了代码的可维护性和可扩展性。

3.2 Spring 注入的原理分析(简易版)

Spring通过底层调⽤对象属性对应的 set ⽅法,完成成员变量的赋值,这种⽅式我们也称之为 set 注⼊ 。(这种方式底层是调用了对象的set方法,如果没有set方法是会报错的)

image.png

3.3 Set 注入详解

针对于不同类型的成员变量,在标签,需要嵌套其他标签

image.png

3.3.1 JDK内置类型

略…

3.3.2 自定义类型

3.3.2.1 第一种方式
  • 为成员变量提供set get⽅法
  • 配置⽂件中进⾏注⼊(赋值:将 userDAO 赋值给 UserServiceImpl)
<bean id="userService" class="xxxx.UserServiceImpl">
    <property name="userDAO">
        <bean class="xxx.UserDAOImpl"/>
    </property>
</bean>
3.3.2.2 第二种方式
  1. 第一种方式存在的问题
  • 配置⽂件代码冗余
  • 被注⼊的对象(UserDAO),多次创建,浪费(JVM)内存资源
  1. 为成员变量提供set get⽅法
  2. 配置⽂件中进⾏配置
<bean id="userDAO" class="xxx.UserDAOImpl"/>

<bean id="userService" class="xxx.UserServiceImpl">
    <property name="userDAO">
        <ref bean="userDAO"/>
    </property>
</bean>

3.4 构造注入

注⼊:通过Spring的配置⽂件,为成员变量赋值

Set注⼊:Spring调⽤Set⽅法 通过配置⽂件 为成员变量赋值

构造注⼊:Spring调⽤构造⽅法 通过配置⽂件 为成员变量赋值

3.4.1 步骤

  1. 提供有参构造⽅法
public class Customer implements Serializable {
    private String name;
    private int age;
    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
  1. Spring的配置⽂
<bean id="customer"
      class="com.snow.po.Customer">
    <constructor-arg>
        <value>wang</value>
    </constructor-arg>
    <constructor-arg>
        <value>20</value>
    </constructor-arg>
</bean>

3.4.2 构造方法重载

  1. 参数个数不同

通过控制标签的数量进⾏区分

  1. 构造参数个数相同时

通过在标签引⼊ type属性 进⾏类型的区分


3.5 注入总结

依赖注入主要有以下几种类型:

造函数注入:通过构造函数将依赖项注入到对象中。当创建对象时,容器会在构造对象时将依赖项作为参数传递给构造函数。


Setter 方法注入:通过调用对象的 Setter 方法来注入依赖项。在这种模式下,容器会通过调用对象的 Setter 方法来设置依赖项。


字段注入:通过直接设置对象的字段来注入依赖项。在这种模式下,容器会直接通过反射或其他方式将依赖项设置到对象的字段上。


依赖注入的优势在于,它使得对象的创建和依赖关系的管理不再由对象自身来完成,而是交由容器来完成。这样做的好处是降低了对象之间的耦合度,提高了代码的灵活性和可测试性,同时也使得代码更加清晰和易于维护。



实战中,应⽤set注⼊还是构造注⼊?


答案:set 注⼊更多


  1. 构造注⼊麻烦 (重载)
  2. Spring框架底层 ⼤量应⽤了 set注⼊

image.png

相关文章
|
9月前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
816 0
|
4月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
286 3
|
4月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
137 1
|
2月前
|
Java Spring
一键注入 Spring 成员变量,顺序编程
介绍了一款针对Spring框架开发的插件,旨在解决开发中频繁滚动查找成员变量注入位置的问题。通过一键操作(如Ctrl+1),该插件可自动在类顶部添加`@Autowired`注解及其成员变量声明,同时保持光标位置不变,有效提升开发效率和代码编写流畅度。适用于IntelliJ IDEA 2023及以上版本。
一键注入 Spring 成员变量,顺序编程
|
9月前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
155 3
|
4月前
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
123 1
|
6月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
6月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
69 0
|
6月前
|
安全 Java 开发者
开发者必看!@Resource与private final的较量,Spring Boot注入技巧大揭秘,你不可不知的细节!
【8月更文挑战第29天】Spring Boot作为热门Java框架,其依赖注入机制备受关注。本文通过对比@Resource(JSR-250规范)和@Autowired(Spring特有),并结合private final声明的字段注入,详细探讨了两者的区别与应用场景。通过示例代码展示了@Resource按名称注入及@Autowired按类型注入的特点,并分析了它们在注入时机、依赖性、线程安全性和单一职责原则方面的差异,帮助开发者根据具体需求选择最合适的注入策略。
238 0
|
8月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves