11.18 Spring装配Bean
本章内容
Bean自动装配
基于注解装配Bean
Bean自动装配
概念:
Bean的装配可以理解为依赖关系注入,Bean的装配方式是Bean的依赖注入方式
具体是指:
Spring容器在不使用 <constructor-arg> 和<property>标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个Bean注入其他Bean的Property中。
Spring支持的装配Bean的方式:
基于
XML的Bean装配
基于
Annotation的Bean装配和自动装配等
下面主要介绍基于annotation的Bean装配和自动装配
- 
使用自动装配需要配置 <bean>元素的autowire属性。
autowire属性的值:
| 名称 | 说明 | 
|---|---|
| no | 默认值,表示不使用自动装配,Bean 依赖必须通过 ref 元素定义。 | 
| byName | 根据 Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中。 | 
| byType | 根据 Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配。 | 
| constructor | 类似于 byType,根据构造方法参数的数据类型,进行 byType 模式的自动装配。 | 
| autodetect(3.0版本不支持) | 如果 Bean 中有默认的构造方法,则用 constructor 模式,否则用 byType 模式。 | 
示例:
- 
使用之前的 Person、Man、MainApp类作为基础
- 
修改 Beans.xml配置文件实现自动装配
不使用自动装配(autowire=no):
Bean通过ref元素定义,Beans.xml配置修改如下:
按名称自动装配(autowire=byName):
XML文件中Bean的id必须与类中的属性名称相同:
<bean id="man" class="com.bean.Man">
    <constructor-arg value="bean" />
    <constructor-arg value="12" type="int" />
</bean>
<bean id="person" class="com.bean.Person" autowire="byName" />
注意:
- 
如果更改 Bean的名称很可能会导致注入失败
按类型自动装配(autowire="byType"):
XML文件中Bean的id与类中的属性名称可以不同,但必须只有一个类型的Bean。
<bean id="man1" class="com.bean.Man">
    <constructor-arg value="bean" />
    <constructor-arg value="12" type="int" />
</bean>
<bean id="person" class="com.bean.Person" autowire="byType" />
构造函数自动装配(autowire="constructor"):
类中构造函数的参数必须在配置文件中有相同的类型:
<bean id="man" class="com.bean.Man">
    <constructor-arg value="bean" />
    <constructor-arg value="12" type="int" />
</bean>
<bean id="person" class="com.bean.Person" autowire="constructor" />
基于注解装配Bean
注意点:
- 
Spring默认不适用注解装配Bean,需要在配置文件中添加<context:annotation-config />启用注解
Spring中常用的注解
- 
@Component:描述spring中的bean可以用在任何层次。只需要将注解标注在相应的类上即可
- 
@Respository:将DAO层的类标识为spring中的bean。功能与component相同。
- 
@Service:将Service层的类标识为spring中的bean。
- 
@Controller:将controller控制层的类标注为spring的bean。
- 
@Autowired:应用到bean的属性变量,属性的setter和getter方法以及构造函数。配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。
- 
@Resource:作用与autowired相同。resource默认按照bean实例名称进行装配- 
name属性:解析为bean的实例名称,指定name属性,则按实例名称进行装配
- 
type属性:解析为bean的实例类型,指定type属性,则按Bean类型进行装配
 
- 
如果属性都不指定则先按Bean实例名称装配,无法匹配再按Bean类型进行装配。都无法匹配抛出NoSuchBeanDefinitionException异常
- 
@Qualifier:与autowired配合使用。默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号