- 自动装配是使用spring满足bean依赖的一种方法
- spring会在应用上下文中为某个bean寻找其依赖的bean。
spring中有三种自动装配方式
(1)在xml中显示装配
(2)在java中显示装配
(3)隐式的自动装配bean【重要】
7.1环境搭建
(1)一个人有俩个臭物,猫狗
7.2自动装配
(2)byName自动装配
<bean id="cat" class="com.sqt.pojo.Cat"/>
<bean id="dog" class="com.sqt.pojo.Dog"/>
<!--
byName的方式会自动在容器的上下文去查找,和自己对象set方法后面的值相对应的beanid
-->
<bean id="people" class="com.sqt.pojo.People" autowire="byName">
<property name="name" value="撒旦法"/>
<!-- 报错,people初始化失败,这里不是赋值而是指向cat和dog的beans对象-->
<!-- <property name="cat" value="黑猫"/>-->
<!-- <property name="dog" value="白狗"/>-->
<!-- <property name="cat" ref="cat"/>-->
<!-- <property name="dog" ref="dog"/>-->
</bean>
(3)byType只能在对象全局唯一时可以自动装配
<bean id="cat" class="com.sqt.pojo.Cat"/>
<bean id="dog" class="com.sqt.pojo.Dog"/>
<!--
byName的方式会自动在容器的上下文去查找,和自己对象属性相同的类bean-->
<bean id="people" class="com.sqt.pojo.People" autowire="byType">
<property name="name" value="撒旦法"/>
<!-- 报错,people初始化失败,这里不是赋值而是指向cat和dog的beans对象-->
<!-- <property name="cat" value="黑猫"/>-->
<!-- <property name="dog" value="白狗"/>-->
<!-- <property name="cat" ref="cat"/>-->
<!-- <property name="dog" ref="dog"/>-->
</bean>
小结:使用 byName的时候需要保证所有的bean的id是全局唯一的,并且在这个bean需要和自动注入的set方法的值一致
使用 byType的时候需要保证所有的bean的class是全局唯一的,并且在这个bean需要和自动注入的属性类型一致的值一致
7.3使用注解进行自动装配
jdk1.5开始支持注解,spring2.5开始全面支持注解。
准备工作:利用注解的方式注入属性。
1.导入约束
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
2.开启属性注解支持
<context:annotation-config/>
(1)@Autowired(需要导入spring的包)
@Autowired可以直接在属性上使用,也可以直接在set方法上使用
注意:使用@Autowired可以省略set方法,前提是你这个自动装配的属性在IOC(spring)容器中存在且符合名字byName
@Autowired
private Cat cat;
@Autowired
private Dog dog;
科普
@Autowired(required=false) 说明:false,对象可以为null;true,对象必须存对象,不能为null。
如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;
(2)@Qualifier
@Autowired
private Cat cat;
@Autowired
@Qualifier(value = "cat1")
private Dog dog;
如果自动装配的环境复杂,自动装配无法通过一注解来实现@Autowired,那么我们可以使用@Qualifier和@autowired一起使用,
@Qualifier(value = "dog2")指定一个唯一的bean对象注入
- @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
- @Qualifier不能单独使用。
(3)@Resource
@Resource
private Cat cat;
@Resource
private Dog dog;
- @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
- 其次再进行默认的byName方式进行装配;
- 如果以上都不成功,则按byType的方式自动装配。
- 都不成功,则报异常。
小结:1.都是用来自动装配的,都可以放在属性字段上
2.@Autowired通过byName实现,而且必须要求这个对象存在
3.@Resourc默认通过byName实现,如果找不到,就通过byType实现;如果俩个都找不到就会报错