Spring中自动注入的两种方式总结
作者:白胡子永远 发布时间:2022-10-24 08:54:14
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>标签就会报错。
来源:https://blog.csdn.net/weixin_44362089/article/details/127347641


猜你喜欢
- C#之继承继承、封装和多态是面向对象编程的重要特性。其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。派生类隐式获得基类的除构
- 在对类访问使用时,常用到的有访问类的成员、方法。实例化在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字new来实现。由于
- 一、静态静态的定时任务可以直接使用注解@Scheduled,并在启动类上配置@EnableScheduling即可@PostMapping(
- 一、简介WorkManager 用于处理 Android 后台任务。我们只需要设置好任务内容、何时执行,剩下的工作就可以完全交给系统处理。它
- 一、水平分表当业务需求的数据量过大时,一个表格存储数据会非常之多,故时长采用水平分表的方式来减少每张表的数据量即是提升查询数据库时的效率。水
- 一、项目简述( +IW文档)功能:本系统分用户前台和管理员后台。 本系统用例模型有三种,分别是游客、注册用户和系统管 理员。下面分别对这三个
- 前言:发送邮件,肯定是每个公司都会有的基本业务。很多公司都会选择把发送邮件作为一个基础服务,对外提供接口。直接调用就可发邮件了。但是我们都知
- 以下总结是2016/3/23在做一个网站时遇到的一个功能模块,现在将总结从为知笔记上搬家到CSDN,与大家共享,欢迎指正。0.准备工作 0.
- 本文实例介绍了Android如何画出触摸轨迹的方法,分享给大家供大家参考,具体内容如下效果图:实现代码:package com.androi
- 说明Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序。 这些应用程序通过 Spring
- 最近为公司做的一个Demo里面用到了ScrollView嵌套了GridView和ListView,然而在嵌套的时候我发现GridView和L
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 我也不知道这个叫什么,就是比如我要打开我电脑的计算机,可以直接在命令行输入“calc”就可以了。现在用让代码去执行。public stati
- 泛型中占位符T和?有什么区别?这是一个好问题,有的人可能弄不清楚,所以我们这里简单的演示一下,相信大家一定能弄清楚的!先上两段代码:publ
- 一、前言目前 java 垃圾回收主流算法是虚拟机采用 GC Roots Tracing 算法。算法的基本思路是:通过一系列的名为 GC Ro
- 一、系统启动后注入配置package com.example.config;import org.springframework.beans
- 一、面向对象的描述面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的
- **前言:**我们项目中可能有这种需求,每个人请求了哪些接口?做了什么事情?参数是什么?重要的接口我们需要记录操作日志以便查找。操作日志和系
- 先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里。代码在这https://github.
- 本文实例讲述了java读取properties配置文件的方法。分享给大家供大家参考。具体分析如下:这两天做java项目,用到属性文件,到网上