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
猜你喜欢
- AsyncTask什么是AsyncTaskAsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传
- 以下四种方式:1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象
- 前言各位小伙伴大家好,我是A哥。IDEA上个较大版本的发布,要追溯到4月份了:时隔近4个月,北京时间2020-07-28深夜,Intelli
- 首先:因为工作需要,需要对接socket.io框架对接,所以目前只能使用netty-socketio。websocket是不支持对接sock
- 顺序语句顺序顾名思义就是程序自上而下执行public class User { public static voi
- 本文实例讲述了java实现的简单猜数字游戏代码。分享给大家供大家参考。具体代码如下:import java.util.InputMismat
- 第 1 步:将这个 Spring Boot 项目的打包方式设置为 war。<packaging>war</packagin
- SpringMVC接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎
- MyBatis 通过包含的jdbcType类型BIT FLOAT CHAR &nbs
- 数组实现Java 自定义Queue队列及应用Java 自定义队列Queue:队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能
- springboot 多个filter的执行顺序以及配置当项目中有多个filter时,为了便于管理,可以创建一个配置文件,对所有的filte
- 本文是一个 Spring 扩展支持 SPEL 的简单模式,方便第三方通过 Spring 提供额外功能。简化版方式这种方式可以在任何能获取Ap
- 在Android中使用SQLite数据库的入门指南,打算分下面几部分与大家一起分享, 1、什么是SQLite 2、Android中使用SQL
- 这篇文章需要对git具有一定的了解,并且知道如何安装git工具(其实就是上git官网下载个文件,安装)git这种版本控制工具有什么好处第一个
- 机器学习 机器学习的目的是把数据转换成信息。 机器学习通过从数据里提取规则或模式来把数据转成信息。 人脸识别 人脸识别通过级联分类器对特征的
- 微服务治理Spring Cloud 工具套件为微服务治理提供了全面的技术支持。这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、
- Mybatis 复杂对象resultMap数据对象含有普通属性,一对一对象,一对多对象(2种情况:单一主键和复合主键)下面是resultMa
- 1.引入AOP依赖<dependency>
- 1.组件添加1.1@Configuration@Configuration:告诉SpringBoot这是一个配置类配置类里面使用@Bean标
- 首先,良好的编码规范非常重要。在 java 程序中,访问速度、资源紧张等问题的大部分原因,都是代码不规范造成的。单例的使用场景单例模式对于减