基于xml配置自动装配
byName
这是一个people类的bean,注入了他自己的属性以及两个复杂类型属性:
<bean id="cat" class="com.kxy.pojo.Cat"></bean>
<bean id="dog" class="com.kxy.pojo.Dog"></bean>
<bean id="people" class="com.kxy.pojo.People">
<property name="name" value="kxy"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
当你加了autowire=byName属性后
<bean id="cat" class="com.kxy.pojo.Cat"></bean>
<bean id="dog" class="com.kxy.pojo.Dog"></bean>
<bean id="people" class="com.kxy.pojo.People" autowire="byName">
<property name="name" value="kxy"/>
</bean>
byname属性会自动找
与setter参数名相匹配的bean(比较bean的id/name是否与setter参数名一致),从而自动装配了这两个复杂类型的引用。并且省略了手动注入Cat和Dog两个bean的操作。
public void setCat(Cat cat) {//byname会自动找与setter参数名相匹配的bean(cat)
this.cat = cat;
}
public void setDog(Dog dog) {//byname会自动找与setter参数名相匹配的bean(dog)
this.dog = dog;
}
byType
同理,byType属性允许我们省略对象属性类型相匹配的bean。
<bean id="ca341t" class="com.kxy.pojo.Cat" ></bean>
<bean id="doew" class="com.kxy.pojo.Dog" ></bean>
<bean id="people" class="com.kxy.pojo.People" autowire="byType">
<property name="name" value="kxy"/>
</bean>
即便像这样id是乱的,也能通过class引出的类匹配相应的bean。
class的value类型与setter的参数类型进行匹配。
基于xml配置自动装配方式:
- no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
- byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
- byType:通过参数的数据类型进行自动装配。
- constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
- autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
基于注解自动装配
使用@Autowired、@Resource注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置注解的context约束和注解的支持:
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
在启动spring IoC时,容器自动装载了一AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中通过类型(byType)查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称(byName)来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
<bean id="dog" class="com.kxy.pojo.Dog"/>
<bean id="people" class="com.kxy.pojo.People"/>
public class People {
private String name;
@Autowired(required = false)
Cat cat;
@Autowired
Dog dog;
@Autowired可用于:构造函数、成员变量、Setter方法
@Autowired
以@Autowired
应用于成员变量为例:
public class People {
private String name;
@Autowired
Cat cat;
@Autowired
Dog dog;
<bean id="cat" class="com.kxy.pojo.Cat"/>
<bean id="dog" class="com.kxy.pojo.Dog"/>
<bean id="people" class="com.kxy.pojo.People"/>
则cat和dog两个bean就实现了自动装配。
从 Spring Framework 4.3 开始,@Autowired
注解 应用于构造函数时,如果目标 bean 仅定义一个构造函数作为开始,则不再需要在此类构造函数上使用@Autowired
注解。但是,如果有几个构造函数可用,则必须至少注解一个,以告诉容器使用哪个构造函数。
@Autowired和@Resource之间的区别:
(1) @Autowired默认是按照类型装配注入的,如果IoC容器有多个bean,则按照名称装配注入。默认情况下它要求依赖对象必须存在(可以设置它required属性为false来使该容器中的bean允许为空)。
(2) @Resource默认是按照名称(byName)来装配注入的,只有当找不到与名称匹配的bean才会按照类型(byType)来装配注入。
@Qualifier
使用 Spring 的@Qualifier
注解,一般配合@Autowired使用。可以缩小类型匹配的范围,以便为每个参数选择特定的 bean。指定唯一的bean对象。