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

基本概念:@Bean@Configuration

Spring 的 Java 配置支持中的核心组件是使用 @Configuration 注解的类和使用 @Bean 注解的方法。spring-doc.cadn.net.cn

@Bean 注解用于指示一个方法实例化、配置并初始化一个新的对象,该对象将由 Spring IoC 容器进行管理。对于熟悉 Spring 的 <beans/> XML 配置的开发者来说,@Bean 注解所起的作用与 <bean/> 元素相同。你可以在任何 Spring 的 @Bean 中使用带有 @Component 注解的方法,但它们最常与 @Configuration 配置类一起使用。spring-doc.cadn.net.cn

使用 @Configuration 注解一个类,表明其主要用途是作为 bean 定义的来源。此外,@Configuration 类允许通过在同一类中调用其他 @Bean 方法来定义 bean 之间的依赖关系。 最简单的 @Configuration 类如下所示:spring-doc.cadn.net.cn

@Configuration
public class AppConfig {

	@Bean
	public MyServiceImpl myService() {
		return new MyServiceImpl();
	}
}
@Configuration
class AppConfig {

	@Bean
	fun myService(): MyServiceImpl {
		return MyServiceImpl()
	}
}

前面的 AppConfig 类等同于以下 Spring <beans/> XML:spring-doc.cadn.net.cn

<beans>
	<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
完整 @Configuration 与“轻量级” @Bean 模式?

@Bean 方法声明在未使用 @Configuration 注解的类中时,这些方法被称为以“轻量级”(lite)模式进行处理。@Component 注解的类,甚至普通的旧式类中声明的 @Bean 方法都被视为“轻量级”,因为这些类的主要目的并非配置,而 @Bean 方法只是其中的一种附加功能。例如,服务组件可以通过在每个适用的组件类中额外提供一个 @Bean 方法,向容器暴露管理视图。在这种场景下,6 方法是一种通用的工厂方法机制。spring-doc.cadn.net.cn

与完整的 @Configuration 不同,精简版(lite)的 @Bean 方法不能声明 bean 之间的依赖关系。 相反,它们仅作用于其所在组件的内部状态,并可选择性地作用于它们所声明的参数。 因此,此类 @Bean 方法不应调用其他 @Bean 方法。 每个这样的方法实际上只是一个特定 bean 引用的工厂方法,不具有任何特殊的运行时语义。 这样做的正面副作用是,在运行时无需应用 CGLIB 子类化,因此在类设计方面没有任何限制(例如,包含该方法的类可以是 final 的,等等)。spring-doc.cadn.net.cn

在常见场景中,@Bean 方法应声明在 @Configuration 类中, 以确保始终使用“完整”(full)模式,从而使得跨方法引用能够被重定向到容器的生命周期管理。 这可以防止同一个 @Bean 方法意外地通过普通的 Java 调用被触发, 有助于减少在“轻量”(lite)模式下运行时难以追踪的细微 bug。spring-doc.cadn.net.cn

以下章节将深入讨论 @Bean@Configuration 注解。 但首先,我们先介绍使用基于 Java 的配置来创建 Spring 容器的各种方式。spring-doc.cadn.net.cn