:::info 注解是否比 XML 更适合配置 Spring?
基于注解的配置的引入提出了这样一个问题:这种方法是否比 XML 「更好」。简短的回答是 「视情况而定」。长的答案是,每种方法都有它的优点和缺点,而且,通常是由开发者来决定哪种策略更适合他们。由于它们的定义方式,注解在其声明中提供了大量的上下文,导致了更短、更简洁的配置。然而,XML 擅长于在不接触源代码或重新编译的情况下对组件进行布线。一些开发者喜欢在源码附近布线,而另一些人则认为,带注解的类不再是 POJO,此外,配置变得分散,更难控制。
不管是哪种选择,Spring 都能适应这两种风格,甚至将它们混合在一起。值得指出的是,通过JavaConfig 选项,Spring 允许以非侵入性的方式使用注解,而不触及目标组件的源代码,在工具方面,Eclipse 的 Spring 工具支持所有配置风格。 :::
基于注解的配置提供了 XML 设置的替代方案,它依靠字节码元数据来连接组件而不是角括号声明。开发者通过在相关的类、方法或字段声明上使用注解,将配置移到组件类本身,而不是使用 XML 来描述 bean 的接线。正如例子中提到的:AutowiredAnnotationBeanPostProcessor 结合注解使用 BeanPostProcessor 是扩展 Spring IoC 容器的一种常见手段。例如,Spring 2.0 引入了用 @Required
注解强制执行所需属性的可能性。Spring 2.5 让我们有可能遵循同样的一般方法来驱动 Spring 的依赖注入。从本质上讲,@Autowired
注解提供了与 Autowiring Collaborators 中描述的相同的功能,但具有更细粒度的控制和更广泛的适用性。Spring 2.5 还增加了对 JSR-250 注解的支持,如 @PostConstruct
和 @PreDestroy
。Spring 3.0 增加了对 JSR-330(Java 的依赖注入)注解的支持,该注解包含在javax.inject
包中,如 @Inject
和 @Named
。关于这些注解的细节可以在 相关章节中找到。
:::tips 注解注入是在 XML 注入之前进行的。因此,XML 配置覆盖了通过这两种方连接的属性的注解。 :::
一如既往,你可以将后处理器注册为单独的 Bean 定义,但也可以通过在基于 XML 的 Spring 配置中包含以下标签来隐式注册(注意包含上下文命名空间)。
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
<context:annotation-config/>
元素隐式地注册以下后处理器:
- ConfigurationClassPostProcessor
- AutowiredAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor
- PersistenceAnnotationBeanPostProcessor
- EventListenerMethodProcessor
:::tips
<context:annotation-config/>
只在定义它的同一应用上下文中寻找对 Bean 的注解。这意味着,如果你把 <context:annotation-config/>
放在 DispatcherServlet 的 WebApplicationContext 中,它只检查控制器中的 @Autowired Bean
,而不是服务。参见DispatcherServlet 以了解更多信息。
:::