基于注解的容器配置

注解是否比XML更适合配置Spring?

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

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

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

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

您始终可以将后处理器注册为单独的bean定义,但也可以通过在基于XML的Spring配置中包含以下标记来隐式注册它们(注意包含 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/> 放在 DispatcherServletWebApplicationContext 中,它仅检查控制器中的 @Autowired bean,而不检查服务。有关更多信息,请参阅 DispatcherServlet