7. Bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中存在三种装配方式
-
在xml中显式配置
-
在java中显式配置
-
隐式的自动装配(关键)
-
<!-- byName:会自动在容器上下寻找,和自己对象中set方法后面跟的名词对应的bean,存在相同名字时不可用 byType:会自动在容器上下寻找,和自己对象属性类型对应的bean,存在相同对象时不可用 -->
-
7.1 测试装配
环境搭建:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.Yurrize.pojo.Cat"></bean>
<bean id="dog" class="com.Yurrize.pojo.Dog"></bean>
<bean id="people" class="com.Yurrize.pojo.People">
<property name="name" value="Yurrize"></property>
<property name="cat" ref="cat"></property>
<property name="dog" ref="dog"></property>
</bean>
</beans>
7.2 ByName自动装配
<!--byName:会自动在容器上下寻找,和自己对象中set方法后面跟的名词对应的bean,存在相同名字时不可用-->
<bean id="people" class="com.Yurrize.pojo.People" autowire="byName">
<property name="name" value="Yurrize"></property>
</bean>
7.3 ByType自动装配
<!--byType:会自动在容器上下寻找,和自己对象属性类型对应的bean,存在相同对象时不可用-->
<bean id="people" class="com.Yurrize.pojo.People" autowire="byType">
<property name="name" value="Yurrize"></property>
</bean>
小结:
- 使用ByName的时候,需要保证所有的bean的id值唯一2,并且bean需要和自动注入的属性的set方法后面的值保持一致。
- 使用ByType的时候,需要保证所有的bean的class唯一,并且bean需要和自动注入的属性类型一致。
7.4 使用注解实现自动装配
jdk1.5支持注解,Spring2.5开始支持注解,大部分时间使用注解进行开发。
要使用注解:
-
导入约束
-
配置注解的支持: 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>
@Autowired 直接在类或者set方法上使用,使用后set方法可以忽略(前提是IOC容器中存在,且与名字对应,ByName)。
如果@Autowired自动装配无法通过一个注解完成时,可以使用@Qualifier(value=“xxx”)指定唯一的一个bean对象注入。
@Resource(name="xxx");//可以代替上面两个标签
小结:
@Autowired和@Resource的区别:
-
都是用来自动装配的,都可以放在属性字段上
-
@Autowired通过ByType的方式实现,且必须要求对象存在
-
@Resource默认通过ByName的方式实现,如果找不到名字,则通过ByType方式实现!如果两种自动装配的方式都无法找到bean对应的对象,则报错
-
执行顺序不同:
@Autowired通过ByType的方式实现
@Resource默认通过ByName的方式实现