【Spring】Bean的自动装配
程序员文章站
2022-05-03 10:01:42
自动装配是Spring满足bean依赖的一种方式!Spring会在上下文中自动寻找,并自动给bean装配属性!在Spring中三种装配的方式在xml中显示的配置在java中显示配置隐式的自动装配bean【重要】1.测试环境搭建:一个人有两个宠物pojo:2.ByName和ByType的自动装配byName:会自动在容器上下文中查找和自己对象set方法后面的值对应的beanID ....
- 自动装配是Spring满足bean依赖的一种方式!
- Spring会在上下文中自动寻找,并自动给bean装配属性!
在Spring中三种装配的方式
- 在xml中显示的配置
- 在java中显示配置
- 隐式的自动装配bean【重要】
1.测试
环境搭建:一个人有两个宠物
pojo:
2.ByName和ByType的自动装配
byName:会自动在容器上下文中查找和自己对象set方法后面的值对应的beanID
<bean id="cat" class="com.peach.pojo.Cat"></bean>
<bean id="dog" class="com.peach.pojo.Dog"></bean>
<bean id="dog3" class="com.peach.pojo.Dog"></bean>
<!--byName:会自动在容器上下文中查找和自己对象set方法后面的值对应的beanID-->
<!--byType:会自动在容器上下文中查找和自己对象属性类型对应相同的beanID 只能有一种类型-->
<bean id="people" class="com.peach.pojo.People" autowire="byName">
<property name="name" value="peach"/>
</bean>
byType:会自动在容器上下文中查找和自己对象属性类型对应相同的beanID,但是byType不允许同种类型有两个,如下图:这是不允许的。但是byType的好处是,可以在bean属性中不加id。
<bean id="cat" class="com.peach.pojo.Cat"></bean>
<bean id="dog3" class="com.peach.pojo.Dog"></bean>
<!--byName:会自动在容器上下文中查找和自己对象set方法后面的值对应的beanID-->
<!--byType:会自动在容器上下文中查找和自己对象属性类型对应相同的beanID 只能有一种类型-->
<bean id="people" class="com.peach.pojo.People" autowire="byType">
<property name="name" value="peach"/>
</bean>
小结
- byName的时候,需要保证所有的bean唯一,并且这个bean需要和自动注入的属性的set方法的值一致!
- byType的时候,需要保证所有的bean的class唯一,并且这个bean需要和自动注入的属性的类型的值一致!
3.使用注解实现自动装配
使用注解的目的,使配置文件更干净!
要使用注解须知:
- 导入约束,context约束
- 配置注解的支持: context:annotation-config/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
在属性或者set方法上使用@Autowired注解
如果出现下图的情况,@Autowired注解可以与@Qualifier注解配合使用。如下下图。
@Qualifier
-
@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
-
@Qualifier不能单独使用。
@Resource 【可能更常见】
-
@Resource如有指定的name属性,先按该属性进行byName方式查找装配;
-
其次再进行默认的byName方式进行装配;
-
如果以上都不成功,则按byType的方式自动装配。
-
都不成功,则报异常。
@Resource(name = "cat1")
private Cat cat;
@Resource
private Dog dog;
private String name;
小结
@resource 和 @ autowired 的区别
- 都是用来自动装配的,都可以放在属性字段上
- @autowired通过byType的方式实现,而且必须要求这个对象存在!【常用】
- @Resource默认通过byName方式实现,如果找不到名字,则通过bytype实现!若都找不到则报错。【常用】
- 执行顺序不同:@autowired通过byType的方式实现
本文地址:https://blog.csdn.net/alovelypeach/article/details/107281177
推荐阅读
-
Spring的并发问题——有状态Bean和无状态Bean
-
品Spring:SpringBoot轻松取胜bean定义注册的“第一阶段”
-
详解Spring Bean的循环依赖解决方案
-
Spring中Bean的生命周期使用解析
-
spring如何使用命名空间p简化bean的配置
-
spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理
-
Spring学习之Bean的装配多种方法
-
通过实例解析spring bean之间的关系
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
-
Spring启动后获取所有拥有特定注解的Bean实例代码