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

基本概念: @Bean@Configuration

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

@Bean 注解用于指示一个方法实例化、配置和初始化由 Spring IoC 容器管理的新对象。对于熟悉 Spring 的 <beans/> XML 配置的用户来说,@Bean 注解的作用与 <bean/> 元素相同。您可以将 @Bean 注解的方法与任何 Spring @Component 一起使用。但是,它们最常与 @Configuration Bean 一起使用。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注解的类中声明@Bean个方法时,它们被称为以“精简”模式处理。在@Configuration中声明的Bean方法,甚至在普通的类中声明的方法都被视为“精简”,其包含类的主要目的不同,而@Component方法则是一种附加功能。例如,服务组件可以通过每个适用的组件类上的额外@Bean方法向容器暴露管理视图。在这些情况下,@Bean方法是一种通用的工厂方法机制。spring-doc.cadn.net.cn

与完整的 @Configuration 不同,精简版 @Bean 方法不能声明 bean 之间的依赖关系。 相反,它们操作其包含组件的内部状态,并且可选地操作它们可能声明的参数。这样的 @Bean 方法因此不应调用其他 @Bean 方法。每种这样的方法实际上只是特定 bean 引用的工厂方法,没有特殊的运行时语义。这里的积极影响是,运行时不需要应用 CGLIB 子类化,因此在类设计方面没有任何限制(也就是说,包含类可以是 final 等)。spring-doc.cadn.net.cn

在常见情况下,@Bean 方法应在 @Configuration 类中声明, 确保始终使用“完整”模式,并且因此跨方法引用会被重定向到容器的生命周期管理。这可以防止通过常规的 Java 调用意外调用相同的 @Bean 方法,从而有助于减少在“精简”模式下运行时难以追踪的细微错误。spring-doc.cadn.net.cn

@Bean@Configuration 注解在以下章节中有详细讨论。 然而,首先我们介绍通过使用基于 Java 的配置创建 Spring 容器的各种方法。spring-doc.cadn.net.cn