对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

基于注解的容器配置

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

基于注解的配置引入后,引发了一个问题:这种方式是否比 XML “更好”?简短的回答是:“视情况而定。”更详细的回答是:每种方式都有其优缺点,通常由开发者自行决定哪种策略更适合自己。由于注解在其声明中提供了大量上下文信息,因此能够实现更简短、更简洁的配置。然而,XML 在不触及组件源代码或无需重新编译的情况下,就能出色地完成组件之间的装配。一些开发者倾向于将装配逻辑放在源代码附近,而另一些人则认为使用注解的类不再是 POJO(Plain Old Java Object),并且配置会变得分散,更难掌控。spring-doc.cadn.net.cn

无论选择哪种方式,Spring 都能支持这两种风格,甚至可以将它们混合使用。 值得一提的是,通过其 JavaConfig 选项,Spring 允许以非侵入性的方式使用注解,无需修改目标组件的源代码;并且在工具支持方面,所有配置风格都得到了适用于 Eclipse、Visual Studio Code 和 Theia 的 Spring Tools 的支持。spring-doc.cadn.net.cn

除了基于 XML 的配置之外,还提供了基于注解的配置方式,它依赖字节码元数据来装配组件,而不是使用 XML 声明。开发者不再使用 XML 来描述 bean 的装配,而是通过在相关的类、方法或字段声明上使用注解,将配置直接移入组件类本身。正如在 示例:AutowiredAnnotationBeanPostProcessor 中所述,将 BeanPostProcessor 与注解结合使用是扩展 Spring IoC 容器的常见方式。例如,@Autowired 注解提供了与 自动装配协作者 中描述相同的功能,但具有更细粒度的控制和更广泛的适用性。此外,Spring 还提供了对 JSR-250 注解的支持,例如 @PostConstruct@PreDestroy,同时也支持包含在 jakarta.inject 包中的 JSR-330(Java 依赖注入)注解,如 @Inject@Named。有关这些注解的详细信息 可以在 相关部分 中找到。spring-doc.cadn.net.cn

注解注入在 XML 注入之前执行。因此,对于通过这两种方式注入的属性,XML 配置会覆盖注解配置。spring-doc.cadn.net.cn

与往常一样,你可以将这些后处理器注册为单独的 bean 定义,但也可以通过在基于 XML 的 Spring 配置中包含以下标签来隐式注册它们(注意引入了 context 命名空间):spring-doc.cadn.net.cn

<?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/> 元素会隐式注册以下后处理器:spring-doc.cadn.net.cn

<context:annotation-config/> 仅在其所定义的同一应用上下文中查找 bean 上的注解。这意味着,如果你将 <context:annotation-config/> 放在用于 WebApplicationContextDispatcherServlet 中,它只会检查控制器中的 @Autowired bean,而不会检查服务层(services)中的 bean。更多信息请参见DispatcherServletspring-doc.cadn.net.cn