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自动注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解spring中的Aware接口功能

    详解spring中的Aware接口功能

    Spring的依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的,本文重点给大家介绍spring中的Aware接口,感兴趣的朋友一起看看吧
    2022-02-02
  • IntelliJ IDEA Run时报“无效的源发行版:16“错误问题及解决方法

    IntelliJ IDEA Run时报“无效的源发行版:16“错误问题及解决方法

    这篇文章主要介绍了IntelliJ IDEA Run时报“无效的源发行版:16“错误问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • java实现的连接数据库及模糊查询功能示例

    java实现的连接数据库及模糊查询功能示例

    这篇文章主要介绍了java实现的连接数据库及模糊查询功能,结合实例形式分析了java基于jdbc连接数据库及使用LIKE语句实现模糊查询功能的相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • 详解MybatisPlus中@Version注解的使用

    详解MybatisPlus中@Version注解的使用

    在MyBatisPlus中,常常使用@Version实现乐观锁,该注解用于字段上面。本文将通过示例详细讲解@Version注解的使用,感兴趣的可以了解一下
    2022-06-06
  • 详解SpringBoot如何实现整合微信登录

    详解SpringBoot如何实现整合微信登录

    本文主要介绍了SpringBoot实现整合微信登录的过程详解,文中的示例代码介绍的非常详细,对我们的学习过工作有一定的参考价值,需要的朋友可以关注下
    2021-12-12
  • 浅谈spring 常用注解

    浅谈spring 常用注解

    这篇文章主要介绍了浅谈spring 常用注解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java Scanner类用法及nextLine()产生的换行符问题实例分析

    Java Scanner类用法及nextLine()产生的换行符问题实例分析

    这篇文章主要介绍了Java Scanner类用法及nextLine()产生的换行符问题,结合实例形式分析了Scanner类功能、hasNextInt()和nextInt()方法使用及nextLine()产生的换行符问题解决方法,需要的朋友可以参考下
    2019-03-03
  • 详解Maven安装教程及是否安装成功

    详解Maven安装教程及是否安装成功

    这篇文章主要介绍了详解Maven安装教程及是否安装成功,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • IDEA教程之Activiti插件图文详解

    IDEA教程之Activiti插件图文详解

    这篇文章主要介绍了IDEA教程之Activiti插件图文详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java常见内存溢出异常分析与解决

    Java常见内存溢出异常分析与解决

    本篇文章主要分析了JAVA程序内存溢出问题原因,较为详细的说明了java导致程序内存溢出的原因与解决方法,感兴趣的小伙伴们可以参考一下。
    2016-10-10

最新评论