Spring:自动装配bean学习笔记
bean的自动装配
当实体类属性需要依赖特别多的其他类时,bean的自动装配可以帮我们减少xml中许多的配置。
package com.huang.pojo;
public class People {
private Cat cat;
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1.不使用bean自动装配中xml的配置:
<bean id="cat" class="com.huang.pojo.Cat"/>
<bean id="dog" class="com.huang.pojo.Dog"/>
<bean id="people" class="com.huang.pojo.People">
<property name="name" value="姓名"/>
<property name="dog" ref="dog"/>
<property name="cat" ref="cat"/>
</bean>
因为这个例子中我们实体类需要依赖的其他类比较少,所以配置bean的property属性是觉得也不是很繁琐,但是一旦我们需要依赖的其他类多了起来,property属性的配置也就会越来越多,很麻烦。
2.使用bean自动装配(通过byName):
<bean id="cat" class="com.huang.pojo.Cat"/>
<bean id="dog" class="com.huang.pojo.Dog"/>
<bean id="people" class="com.huang.pojo.People" autowire="byName">
<property name="name" value="姓名"/>
</bean>
通过设置bean的属性autowire="byName"后,自动装配便会在容器的上下文中查找和自己对象属性名字相同的id的bean并配置。
3.使用bean自动装配(通过byType):
<bean id="cat" class="com.huang.pojo.Cat"/>
<bean id="dog" class="com.huang.pojo.Dog"/>
<bean id="people" class="com.huang.pojo.People" autowire="byType">
<property name="name" value="姓名"/>
</bean>
通过设置bean的属性autowire="byType"后,自动装配便会在容器的上下文中查找和自己对象属性类型相同的bean,但是容器上下文中只能有一个该类型的bean。
使用注解实现自动装配
1.使用注解实现自动装配必须先在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"
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
https://www.springframework.org/schema/context/spring-context.xsd">
2.在xml中设置开启注解支持:
<!--开启注解支持-->
<context:annotation-config/>
3.注册相关bean:
<bean id="dog" class="com.huang.pojo.Dog"/>
<bean id="cat" class="com.huang.pojo.Cat"/>
<bean id="people" class="com.huang.pojo.People"/>
4.使用注解:
@Autowired
private Cat cat;
@Autowired
@Qualifier(value = "dog")
private Dog dog;
private String name;
- @Autowired会先通过byType的方式在你容器上下文中寻找bean,如果你容器上下文中有多个注释下对象类型的bean,再通过byName的方式寻找对应的bean。
- 在@Autowired下可以再用@Qualifier(value = )注释,指定装配一个id为value的bean。
- 通过@Autowired(required = false)可以设置required ,required默认为true,默认情况下它要求依赖对象必须存在。设置required 为false之后 ,可以允许你在容器上下文中不定义注释属性类型的bean。
@Resource与@Autowired的不同
- @Resource有两个属性name和type,可以通过属性值指定寻找容器上下文的bean
- @Resource两个属性都没有指定的情况下,先通过byName的方式进行装配,如果找不到对应的bean,再通过byType方式去寻找。
注:@Resource与@Autowired注解都可注解在属性的set方法上。