3.2 Bean的配置
在上一小节中为了演示容器Bean实例化时暴露出的几个接口,将UserBean配置在XML中,其实常见的Bean配置有3种:基于XML配置Bean,使用注解定义Bean,基于Java类提供Bean定义。
3.2.1 基于XML配置Bean
基于XML配置Bean时,Spring通过<bean>配置来实例化、设置bean的属性以及设置bean间的相互依赖性。一个<bean>通常需要定义id和class属性。class属性是必需的,不然Spring怎么知道是哪个呢。id不是必需的,不过如果配置文件中配置的其他bean要引用该bean,那么id也是必需的,通常都加上。
<bean id="user" class="com.demo.model.UserBean"></bean>
3.2.2 使用注解定义Bean
如果采用基于XML的配置,bean定义信息和bean实现类本身是分离的,而采用基于注解的配置方式时,bean定义信息即通过在bean实现类上标注注解实现。在第2章中,定义Air和Person时都使用了@Component来注解bean。
我们使用@Component注解在CleanAir类声明处对类进行标注,它可以被Spring容器识别,自动将POJO转换为容器管理的bean。它和<bean id="CleanAir"class="com.demo.model.CleanAir"></bean>是等效的。除了@Component以外,Spring提供了以下3个功能基本和@Component等效的注解,分别用于对DAO、Service及Web层的Controller进行注解,所以也称这些注解为Bean的衍型注解:
● @Repository:用于对DAO实现类进行标注。
● @Service:用于对Service实现类进行标注。
● @Controller:用于对Controller实现类进行标注。
那问题来了:既然都是bean,为什么还提供4个呢?因为这样能让注解的用途更加清晰,而且不同的注解也有各自特殊的功能。
3.2.3 基于Java类提供Bean定义
在普通的POJO类中只要标注@Configuration注解,就可以为Spring容器提供bean定义的信息了。每个标注了@Bean的类方法都相当于提供了一个bean的定义信息。
我们只需在XML中配置开启context扫描即可实现bean的配置,省去了配置Person、DirtyAir。
输出结果:
DirtyAir
基于Java类的配置方式和基于XML或基于注解的配置方式相比,前者通过代码的方式更加灵活地实现了Bean的实例化及Bean之间的装配,后面两者是通过配置声明的方式实现的,在灵活性上要稍逊一些,但是配置上要更简单一些。