Spring中自动注入的两种方式总结

 更新时间:2022年10月17日 15:33:18   作者:白胡子永远  
Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert依赖注入)。而依赖注入(DI)的实现方式又有两种,xml方式和注解方式。本文就来详细聊聊这两个方式,需要的可以了解一下

1. 前言

Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert依赖注入)。而依赖注入(DI)的实现方式又有两种,xml方式和注解方式。如下图所示:

2. set注入和构造注入

set注入和构造注入,这两种方法,是我们在第一次接触Spring的时候,最先学习使用Spring容器创建对象并赋值的方式。具体的代码及详细解释我已经写在了我前一篇的文章里,这里的链接:点进去就能看到很仔细的set注入和构造注入的详细介绍和使用方法。

3. 什么情况下要使用自动注入

在我们学习完set注入和构造注入之后,我们可能会发现,要是某个类的引用属性,也是其他类的属性的时候,若我们使用大量的使用<propterty name="" ref="">去给其他类的这个引用属性赋值,就会显得十分的冗余。如下所示:

<beans>
 
<bean id="a" class="">
    <property name="" value=""/>
    <property name="11" ref="22"/> <!-某个引用类型的属性是很多其他类的属性-->
</bean>
 
<bean id="b" class="">
    <property name="" value=""/>
    <property name="11" ref="22"/> <!-某个引用类型的属性是很多其他类的属性-->
</bean>
 
 
<bean id="c" class="">
    <property name="" value=""/>
    <property name="11" ref="22"/><!-某个引用类型的属性是很多其他类的属性-->
</bean>
 
 
<bean id="d" class="">
    <property name="" value=""/>
    <property name="11" ref="22"/><!-某个引用类型的属性是很多其他类的属性-->
</bean>
 
 
</beans>

上面的写法就很冗余,那么有简单的写法吗?当然有,这种简便的方法就是自动注入。

4. 自动注入之byName

下面紧挨着的代码就是自动注入中的byName方式。

byName自动注入的特点就是,在<bean>标签中多写上了一个属性,type="byName"。

<bean id="" class="" type="byName">
    <property name="" value=""/> <!--给基本类型属性赋值,不能使用byName自动注入-->
    <property name="" ref=""/>  <!--引用类型属性赋值,可以使用byName自动注入,进而实现简写-->
</bean>
 

byName自动注入的使用要求:

必须依赖set()方法,也就是说只支持对set注入方式的简写。

<bean>
    <property name="" value=""/>
    <property name="" ref=""/>
</bean>

 不支持构造注入。

<bean>
    <constructor-arg name="" value=""/>
</bean>

且只支持为引用类型属性赋值的时候使用byName的方式实现给引用类型属性赋值;给简单类型的属性赋值,不能使用byName这种构造注入,需要正常写。

那么在给引用类型的属性赋值的时候,使用了byName自动注入,那么我们便可以不写<property name="" ref="">。那byName是如何实现给给引用类型属性赋值的呢?

答案是:当Spring发现你使用了byName这种自动注入的时候,它会自动去寻找当前<bean>标签的class类,并去查看该类的引用属性有哪些,然后去当前xml文件中,去比对寻找是否有其他的<bean>标签的id等于该类的引用属性名,和其他<bean>标签的class属性值是否跟当前要赋值的引用属性的类是否一致。若是id和class都匹配上了,那么就会为该引用类型属性赋值。

5. 自动注入之byType注入

下面紧挨着的代码就是自动注入中的byType方式。

byType自动注入的特点就是,在<bean>标签中多写上了一个属性,type="byType"。byType自动注入的方式,跟byName的使用方法和要求几乎一模一样,只是在匹配赋值的时候,略有差别。

<bean id="" class="" type="byType">
    <property name="" value=""/> <!--给基本类型属性赋值,不能使用byType自动注入,需要正常写-->
    <property name="" ref=""/>  <!--引用类型属性赋值,可以使用byType自动注入,进而实现简写-->
</bean>
 
<!---->

byType自动注入的使用要求:

必须依赖set方法,因此必须是对set注入方法的简写

支持set注入:如下所示

<bean>
    <property name="" value=""/>
    <property name="" ref=""/>
</bean>

不支持构造注入:如下所示

<bean>
    <constructor-arg name="" value=""/>
</bean>

只支持给set注入中的引用类型属性赋值时候简写,不支持给set注入中的简单类型赋值,(给set注入中的简单类型赋值,仍需要正常写)如下所示

<bean id="" class="">
    <property name="" value=""/> <!--给基本类型属性赋值,不能使用byType自动注入,需要正常写-->
    <property name="" ref=""/>  <!--引用类型属性赋值,可以使用byType自动注入,进而实现简写-->
</bean>

那么但给引用类型的属性赋值的时候,使用了byType自动注入,那么我们便可以不写<property name="" ref="">。那byType是如何实现给给引用类型属性赋值的呢?

答案是:Spring在见到byType自动注入的时候,会自动匹配其他的<bean>标签的class是否跟当前要创建的对象的引用类型属性是否是,子类,或者是接口实现类。若是则就会自动将匹配上的引用类型的值赋值给当前创建对象的引用类型属性。

!!注意!!:

由于Spring是单例模式,所以在使用自动注入给引用类型的属性匹配的<bean>标签的时候,若是匹配上了两个<bean>标签就会报错。

到此这篇关于Spring中自动注入的两种方式总结的文章就介绍到这了,更多相关Spring自动注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot结合maven配置不同环境的profile方式

    springboot结合maven配置不同环境的profile方式

    这篇文章主要介绍了springboot结合maven配置不同环境的profile方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java基础巩固小项目点菜系统的实现

    Java基础巩固小项目点菜系统的实现

    这篇文章主要介绍了一个Java小项目点菜系统的实现,主要是用的集合,适合正在学习Java的朋友拿来实战练手,感兴趣的朋友快来看看吧
    2022-03-03
  • 如何使用Java 8中DateTimeFormatter类型转换日期格式详解

    如何使用Java 8中DateTimeFormatter类型转换日期格式详解

    这篇文章主要介绍了如何使用Java 8中DateTimeFormatter类型转换日期格式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java 配置log 将日志信息输出到指定日志文件中

    Java 配置log 将日志信息输出到指定日志文件中

    这篇文章主要介绍了Java 配置log 将日志信息输出到指定日志文件中,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • @FeignClient注入找不到异常如何解决

    @FeignClient注入找不到异常如何解决

    这篇文章主要介绍了@FeignClient注入找不到异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • maven如何使用profiles多环境配置

    maven如何使用profiles多环境配置

    在软件开发过程中,我们经常需要在不同的环境中部署和运行我们的应用程序,例如开发环境、测试环境和生产环境,为了方便管理和配置不同环境下的参数,我们可以使用Maven的profiles功能,本文给大家介绍maven如何使用profiles多环境配置,感兴趣的的朋友一起看看吧
    2024-02-02
  • Java中八大包装类举例详解(通俗易懂)

    Java中八大包装类举例详解(通俗易懂)

    这篇文章主要介绍了Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • 使用注解@Validated和BindingResult对入参进行非空校验方式

    使用注解@Validated和BindingResult对入参进行非空校验方式

    这篇文章主要介绍了使用注解@Validated和BindingResult对入参进行非空校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 使用Lombok子类继承父类,父类属性不生效问题及解决

    使用Lombok子类继承父类,父类属性不生效问题及解决

    在使用Lombok库时,若子类继承父类,父类的属性可能不会自动生效,为解决此问题,可通过在父类上添加@Getter和@Setter注解,或使用@SuperBuilder注解来确保父类属性在子类中有效,同时,需注意确保Lombok版本一致且正确配置了相关插件
    2024-10-10
  • 在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接的操作方法

    在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接的操作方法

    本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接,然后实现远程Linux环境进行开发,本例使用的是IDEA2023.2.5版本,感兴趣的朋友跟随小编一起看看吧
    2024-01-01

最新评论