此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 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/> 元素相同。您可以将 @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>
带或不带 @Bean 方法之间本地调用的 @Configuration 类?

在常见场景中,@Bean 方法应在 @Configuration 类中声明, 以确保应用完整的配置类处理,并使跨方法引用被重定向到容器的生命周期管理。 这可以防止通过普通的 Java 方法调用意外地多次调用同一个 @Bean 方法,有助于减少难以追踪的细微错误。spring-doc.cadn.net.cn

当在未使用 @Bean 注解的类中声明 @Configuration 方法,或声明了 @Configuration(proxyBeanMethods=false) 时, 这些方法被称为以“lite”模式进行处理。在这种情况下, @Bean 方法实际上是一种通用的工厂方法机制,没有特殊运行时处理(即不会为其生成CGLIB子类)。 对这类方法的自定义Java调用不会被容器拦截,因此其行为与普通方法调用一致,每次都会创建一个新实例, 而不是重用已有的单例(或作用域)bean实例。spring-doc.cadn.net.cn

因此,对于没有运行时代理的类,@Bean 方法根本不应声明组件之间的依赖关系。相反,它们应操作其所在组件的字段,并可选择性地操作工厂方法可能声明的参数,以接收自动装配的协作对象。因此,这样的 @Bean 方法永远不需要调用其他 @Bean 方法;每个此类调用都可以通过工厂方法的参数来表达。这样做的积极副作用是,运行时无需应用 CGLIB 子类化,从而减少了开销和内存占用。spring-doc.cadn.net.cn

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