基于注解的容器配置

是不是注解就要好于 XML 呢?

注解式配置的引入引发了一个问题,即这种方法是否“更好”于 XML。简短的回答是“视情况而定”。 较长的回答是,每种方法都有其优点和缺点,通常由开发人员决定哪种策略更适合他们。 由于注解的定义方式,它们在声明中提供了很多上下文,导致更简短、更简洁的配置。 然而,XML 擅长在不接触源代码或重新编译的情况下连接组件。一些开发人员喜欢让连接与源代码保持紧密联系, 而另一些人则认为被注解的类不再是 POJOs,并且配置变得分散化,更难以控制。

无论选择哪种方式,Infra 都可以适应两种风格,甚至将它们混合在一起。值得指出的是, 通过其 JavaConfig 选项,Infra 允许以非侵入性的方式使用注解, 而不必触及目标组件的源代码,并且在工具方面,所有的配置风格都受到了 Infra 工具 的支持,包括 Eclipse、Visual Studio Code 和 Theia。

一种替代XML配置的方法是注解驱动的配置,它依赖于字节码元数据来连接组件,而不是 XML 声明。 开发人员可以通过在相关类、方法或字段声明上使用注解,将配置移入组件类本身,而不是使用 XML 来描述bean的连接。 如在 示例:AutowiredAnnotationBeanPostProcessor中所述, 结合注解使用 BeanPostProcessor 是扩展 Infra IoC 容器的常见手段。 例如,@Autowired注解提供了与 自动装配协作者相同的功能, 但具有更精细的控制和更广泛的适用性。此外,Infra还支持JSR-250注解,如 @PostConstruct@PreDestroy, 以及 JSR-330(Java依赖注入)注解,这些注解包含在 jakarta.inject 包中,如 @Inject@Named。有关这些注解的详细信息, 请参阅 相关章节

注解注入在XML注入之前执行。因此,对于通过这两种方法连接的属性,XML配置会覆盖注解。

如常,你可以将后处理器注册为单独的bean定义,但也可以通过在基于XML的Infra配置中包含以下标签来隐式注册它们(请注意包含 context 命名空间):

<?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/> 元素隐式注册了以下后处理器:

<context:annotation-config/> 只会查找与其在同一应用程序上下文中定义的bean上的注解。 这意味着,如果你将 <context:annotation-config/> 放在 MockDispatcherWebApplicationContext 中, 它只会检查你的控制器中的 @Autowired bean,而不是你的服务。有关更多信息,请参阅 The DispatcherServlet