:::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 配置中包含以下标签来隐式注册(注意包含上下文命名空间)。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. https://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context
    8. https://www.springframework.org/schema/context/spring-context.xsd">
    9. <context:annotation-config/>
    10. </beans>

    <context:annotation-config/> 元素隐式地注册以下后处理器:

    :::tips <context:annotation-config/> 只在定义它的同一应用上下文中寻找对 Bean 的注解。这意味着,如果你把 <context:annotation-config/>放在 DispatcherServlet 的 WebApplicationContext 中,它只检查控制器中的 @Autowired Bean,而不是服务。参见DispatcherServlet 以了解更多信息。 :::