Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean的依赖注入的方式。
Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解的装配、自动装配等。其中最常用的是基于注解的装配。
基于XML的装配
Spring提供了两种基于XML的装配方式:设值注入、构造注入
Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter方法来注入属性值。
设值注入:
- Bean类必须提供一个默认的无参构造方法
- Bean类必须为需要注入的属性提供对应的setter方法
- 在配置文件中,需要使用 <property>元素为每个属性注入值
构造注入:
- Bean类必须提供有参构造方法
- 在配置文件中,需要使用<constructor-arg>元素来定义构造方法的参数,也可以使用其value属性来设置该参数的值
基于注解的装配
Spring中定义了一系列的注解,常用的注解如下:
- @Component:描述Spring中的Bean,可以作用在任何层次
- @Repository:用于将持久层(Dao层)的类标识为Spring中的Bean
- @Service:用于将业务层(Service层)的类标识为Spring中的Bean
- @Controller:用于将控制层(Controller层)的类标识为Spring中的Bean
- @Autowired:用于对Bean的属性变量、属性的setter方法以及构造方法进行标注,配合对应的注解处理器完成Bean的自动装配工作。默认按照Bean的类型进行装配
- @Resource:其作用与@Autowired一样。其区别在于@Autowired默认Bean的类型装配,而@Resource默认按照Bean的实例名称进行装配
@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。如果指定name属性,则按实例名称进行装配;如果指定type属性,则按Bean类型进行装配;如果都不指定,则先按Bean的实例名称装配,如果不能匹配,再按照Bean类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException异常。
- @Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为Bean的实例名称装配,Bean的实例名称由 @Qualifier注解的参数指定
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
}
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Resource(name="accountDao")
private AccountDao accountDao;
}
此时,在配置文件中,Spring注解提供了另外一种高效的注解配置方式。
含义是:告知Spring在创建容器时要扫描的包(通知Spring扫描指定包下的所有Bean)
<context:component-scan base-package="cn.itcast"></context:component-scan>
自动装配
自动装配:将一个Bean自动地注入到其他Bean的Property中
Spring的 <bean>元素中包含一个 autowire 属性,我们可以通过设置 autowire 的属性值来自动装配Bean。
autowire属性的5个值:
- default(默认):由<beans>的default-autowire属性值来确定。
- byName:根据属性的名称自动装配。容器将根据名称查找与属性完全一致的Bean,并将其属性自动装配
- byType:根据属性的数据类型自动装配。
- constructor:根据构造函数参数的数据类型,进行byType模式的自动装配
- no:在默认情况下,不使用自动装配,Bean依赖必须通过ref元素定义