
3.5 Bean的装配方式
Bean的装配可以理解为将Bean依赖注入到Spring容器中,Bean的装配方式即Bean依赖注入的方式。Spring容器支持基于XML配置的装配、基于注解的装配以及自动装配等多种装配方式,其中最受青睐的装配方式是基于注解的装配(在本书后续章节中采用基于注解的装配方式装配Bean)。本节将主要讲解基于XML配置的装配和基于注解的装配。
3.5.1 基于XML配置的装配
基于XML配置的装配方式已经有很久的历史了,曾经是主要的装配方式。通过2.3节的学习,我们知道Spring提供了两种基于XML配置的装配方式,即使用构造方法注入和使用属性的setter方法注入。
在使用构造方法注入方式装配Bean时,Bean的实现类需要提供带参数的构造方法,并在配置文件中使用<bean>元素的子元素<constructor-arg>来定义构造方法的参数;在使用属性的setter方法注入方式装配Bean时,Bean的实现类需要提供一个默认无参数的构造方法,并为需要注入的属性提供对应的setter方法,另外还需要使用<bean>元素的子元素<property>为每个属性注入值。
下面通过一个实例来演示基于XML配置的装配方式。
① 创建Bean的实现类
在ch3应用的src目录中创建assemble包,在assemble包下创建ComplexUser类。在ComplexUser类中分别使用构造方法注入和使用属性的setter方法注入。具体代码如下:

② 配置Bean
在Spring配置文件中使用实现类ComplexUser配置Bean的两个实例,具体代码如下:

③ 测试基于XML配置的装配方式
在ch3应用的test包中创建测试类TestAssemble,具体代码如下:

上述测试代码的运行结果如图3.8所示。

图3.8 基于XML配置的装配方式的测试结果
3.5.2 基于注解的装配
在Spring框架中,尽管使用XML配置文件可以很简单地装配Bean,但如果应用中有大量的Bean需要装配,会导致XML配置文件过于庞大,不方便以后的升级与维护,因此更多的时候推荐开发者使用注解(annotation)的方式去装配Bean。
在Spring框架中定义了一系列的注解,下面介绍几种常用的注解。
① @Component
该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。下面通过一个实例讲解@Component。
1)创建Bean的实现类
在ch3应用的src目录下创建annotation包,在该包下创建Bean的实现类AnnotationUser,代码如下:

2)配置注解
现在有了Bean的实现类,但还不能进行测试,因为Spring容器并不知道去哪里扫描Bean对象,需要在配置文件中配置注解,方式如下:

在ch3应用的src目录下创建配置文件annotationContext.xml,代码如下:

3)测试Bean实例
在test包中创建测试类TestAnnotation,测试上述Bean,具体测试代码如下:

注:在Spring 4.0以上的版本,配置注解指定包中的注解进行扫描前需要事先导入Spring AOP的JAR包spring-aop-5.0.2.RELEASE.jar。
② @Repository
该注解用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层Bean,其功能与@Component相同。
③ @Service
该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同。
④ @Controller
该注解用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component相同。
⑤ @Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。
⑥ @Resource
该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。
@Resource注解有两个属性——name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。
⑦ @Qualifier
该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。
在上面几个注解中,虽然@Repository、@Service和@Controller等注解的功能与@Component注解相同,但为了使类的标注更加清晰(层次化),在实际开发中推荐使用@Repository标注数据访问层(DAO层)、使用@Service标注业务逻辑层(Service层)、使用@Controller标注控制器层(控制层)。
下面通过一个实例讲解如何使用这些注解。
1)创建DAO层
在ch3应用的src中创建annotation.dao包,在该包下创建TestDao接口和TestDaoImpl实现类,并将实现类TestDaoImpl使用@Repository注解标注为数据访问层。
TestDao的代码如下:

TestDaoImpl的代码如下:

2)创建Service层
在ch3应用的src中创建annotation.service包,在该包下创建TestService接口和TestSeviceImpl实现类,并将实现类TestSeviceImpl使用@Service注解标注为业务逻辑层。
TestService的代码如下:

TestSeviceImpl的代码如下:

3)创建Controler层
在ch3应用的src中创建annotation.controller包,在该包下创建TestController类,并将TestController类使用@Controller注解标注为控制器层。
TestController的代码如下:

4)配置注解
由于annotation.dao、annotation.service和annotation.controller包都属于annotation包的子包,因此不需要在配置文件annotationContext.xml中配置注解。
5)创建测试类
在ch3应用的test包中创建测试类TestMoreAnnotation,具体代码如下:
