前言
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给bean装配属性(这个属性一般是指bean里面嵌套bean)
主要有以下两种方式:
在xml中显式配置
初代版xml
<bean id&#61;"cat" class&#61;"com.kuang.pojo.Cat"/><bean id&#61;"dog" class&#61;"com.kuang.pojo.Dog"/><bean id&#61;"people" class&#61;"com.kuang.pojo.People"><property name&#61;"name" value&#61;"小白莲"/><property name&#61;"cat" ref&#61;"cat"/><property name&#61;"dog" ref&#61;"dog"/>bean>
ByName自动装配
<bean id&#61;"people" class&#61;"com.kuang.pojo.People" autowire&#61;"byName"><property name&#61;"name" value&#61;"小白莲"/>
bean>
ByType自动装配
<bean id&#61;"people" class&#61;"com.kuang.pojo.People" autowire&#61;"byType"><property name&#61;"name" value&#61;"小白莲"/>
bean>
小结&#xff1a;
- ByName的时候&#xff0c;需要保证所有bean的id唯一&#xff0c;并且这个bean需要和自动注入的属性的set方法的值一致&#xff01;
- ByType的时候&#xff0c;需要保证所有bean的class唯一&#xff0c;并且这个bean需要和自动注入的属性的类型一致&#xff01;如果class不唯一&#xff0c;可以运行&#xff0c;但可能不是想要的对象
使用注解实现自动装配
jdk1.5支持注解&#xff0c;Spring2.5支持注解
使用注解须知&#xff1a;
<beans xmlns&#61;"http://www.springframework.org/schema/beans"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&#61;"http://www.springframework.org/schema/context"xsi:schemaLocation&#61;"http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/>
beans>
&#64;Autowired
直接在属性上使用即可&#xff01;也可以在set方法上使用&#xff01;
使用Autowired我们就可以不用编写set方法了&#xff0c;前提是你这个自动配置的属性在IOC&#xff08;Spring&#xff09;容器中存在&#xff0c;且符合名字ByName&#xff01;
- &#64;Nullable 字段标记了了这个注解&#xff0c;说明这个字段可以为null;
- &#64;Autowired(required &#61; false)
如果&#64;Autowired自动装配的环境比较复杂&#xff0c;自动装配无法通过一个注解【&#64;Autowired】完成的时候&#xff0c;我们可以使用&#64;Qualifier(value &#61; “xxx”)去配置&#64;Autowired的使用&#xff0c;指定一个唯一的bean对象注入&#xff01;
&#64;Resource和&#64;Autowired的区别&#xff1a;
都是用来自动装配的&#xff0c;都可以放在属性字段上
&#64;Autowired通过byType的方式实现&#xff0c;而且必须要求这个对象存在&#xff01;【常用】所以byType不需要用set方法
&#64;Resource默认通过byName的方式实现&#xff0c;如果找不到名字&#xff0c;则通过byType实现&#xff01;如果两个都找不到的情况下&#xff0c;就报错&#xff01;【常用】
执行顺序不同&#xff1a;&#64;Autowired通过byType的方式实现。
package com.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import javax.annotation.Resource;public class People {&#64;Resourceprivate Cat cat;&#64;Autowired&#64;Qualifier(value &#61; "dog")private Dog dog;private String name;&#64;Overridepublic String toString() {return "People{" &#43;"cat&#61;" &#43; cat &#43;", dog&#61;" &#43; dog &#43;", name&#61;&#39;" &#43; name &#43; &#39;\&#39;&#39; &#43;&#39;}&#39;;}public Cat getCat() {return cat;}
public Dog getDog() {return dog;}
public String getName() {return name;}public void setName(String name) {this.name &#61; name;}
}
总结
byType&#xff1a;&#64;Autowired 根据bean中的属性名匹配&#xff0c;也就是通过class
byName&#xff1a;根据bean中的set方法对应的值&#xff0c;这个是通过property的name
&#64;Autowired直接放属性名&#xff0c;特别地可以有多个名字&#xff0c;用Qualifier&#xff0c;如果require为false就可以为null
&#64;Resource先默认通过byName&#xff0c;如果没有set或找不到对应的名字&#xff0c;则变成byType