-
自动装配是Spring满足bean依赖的一种方式
-
Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种装配方式
-
xml配置
-
java配置
-
隐式的自动装配bean【重要】
7.1、ByName自动装配
在容器上下文中查找,和自己对象名set后面的值对应的bean id
<bean id="cat" class="com.mosang.pojo.cat"/>
<bean id="dog" class="com.mosang.pojo.dog"/>
<bean id="person" class="com.mosang.pojo.person" autowire="byName">
<property name="name" value="小墨"/>
</bean>
7.2、ByType自动装配
bytype:在容器上下文中查找,和自己对象属性类型相同的bean,id可省略
<bean class="com.mosang.pojo.cat"/>
<bean class="com.mosang.pojo.dog"/>
<bean id="person" class="com.mosang.pojo.person" autowire="byType">
<property name="name" value="小墨"/>
</bean>
小结:
-
byname时需要保证所有bean的id唯一,并且bean需要和自动装配的属性的set方法的值一致
-
bytype时需要保证所有bean的class唯一,并且bean需要和自动装配的属性的类型一致
7.3、使用注解实现自动装配
@Autowired注解
-
导入约束
context约束
-
配置注解支持
<context:annotation-config/>
@Autowired private cat cat; @Autowired @Qualifier(value = "dog11") private dog dog; private String name; <?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/> <bean id="cat" class="com.mosang.pojo.cat"/> <bean id="dog" class="com.mosang.pojo.dog"/> <bean id="dog11" class="com.mosang.pojo.dog"/> <bean id="person" class="com.mosang.pojo.person" autowire="byType"/> </beans>
直接在属性上使用即可,也可以在set方式上使用.
使用autowired可以不写set方法,前提是容器中存在且符合byname
@Autowired智能识别
-
当注入IOC容器中该类型只有一个时,通过bytpe装配
-
当注入容器时存在多个同一类型的对象时,根据byname装配
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解完成时,我们可以使用@Qualifier(value="xxx")去配置@Autowired使用,指定唯一的bean对象注入
@Resource注解
@Resource
private cat cat;
@Resource(name = "dog11")
private dog dog;
private String name;
@Resource和@Autowired的区别:
-
都是用来自动装配的,都可以放在属性字段上
-
@Autowired通过byType的方式实现,而且必须要求这个对象存在
-
@Resource默认通过byName的方式实现,如果找不到名字,则通过byType实现,如果两个都找不到的情况下,就报错!
-
执行顺序不同,@Autowired先byType,@Resource先byName