自动装配是Spring满足bean依赖的一种方式
Spirng会在上下文中自动寻找,并自动给bean装配属性
Spring 有三种装配方式:
- 1、在xml中配置
- 2、在java中配置
- 3、隐式的自动装配bean【重点】
xml配置文件中实现装配
xml中装配
<?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.cn.Cat">
<property name="name" value="maomao"/>
</bean>
<bean id="dog" class="com.cn.Dog">
<property name="name" value="gougou"/>
</bean>
<bean id="people" class="com.cn.People">
<property name="name" value="xxxxx"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
<!-- more bean definitions go here -->
</beans>
xml配置文件中自动装配
<?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.cn.Cat">
<property name="name" value="maomao"/>
</bean>
<bean id="dog" class="com.cn.Dog">
<property name="name" value="gougou"/>
</bean>
<!-- byName 会自动在上下文中找符合自己类中setter方法中value的 bean id。-->
<bean id="people" class="com.cn.People" autowire="byName">
<property name="name" value="xxxxx"/>
</bean>
<!-- byName 会自动在上下文中找符合自己类中setter方法中类型相同的 bean。全局中只允许存在一个类型-->
<bean id="people" class="com.cn.People" autowire="byType">
<property name="name" value="xxxxx"/>
</bean>
<!-- more bean definitions go here -->
</beans>
注意:
- 比如当前有 人、猫、狗 三个类,人拥有猫和狗,那么 人 这个类中要实现 setter 猫和狗的 方法。
- byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致。
- byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致。
注解实现自动装配
jdk1.5 开始支持注解,Spring 2.5 开始支持注解
要使用注解须知:
- 导入约束 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/>
<!-- more bean definitions go here -->
</beans>
@Autowired
直接在属性上使用即可,也可以在set方法上使用
使用Autowired 可以不用编写set方法,前提是这个自动装配的属性在 IOC(Spring)容器中存在,且符合名字byName
package com.cn;
import org.springframework.beans.factory.annotation.Autowired;
public class People {
private String name;
@Autowired(required = false) // 表示该字段可以位null,否则不允许为空
public Cat cat;
@Autowired // 该注解会自动根据名字或者类型找到目标
@Qualifier(value="dogss") // 如果自动装配Autowired无法找到目标,可以配合Qualifier指定对象注入
public Dog dog;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
扩展:java的注解 @Resource 实现了Autowired 的方法。