对于最新稳定版本,请使用 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 类中, 以确保应用完整的配置类处理机制,从而使方法间的相互引用被重定向到容器的生命周期管理。 这样可以防止同一个 @Bean 方法意外地通过普通的 Java 方法调用被执行, 有助于减少难以追踪的细微 bug。spring-doc.cadn.net.cn

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

因此,对于未使用运行时代理的类,其上的 @Bean 方法根本不应声明 Bean 之间的依赖关系。相反,这些方法应操作其所属组件的字段,并可选择性地操作工厂方法所声明的参数,以接收自动装配的协作者(collaborators)。因此,此类 @Bean 方法永远无需调用其他 @Bean 方法;所有此类调用均可通过工厂方法的参数来表达。这样带来的正面副作用是,运行时无需应用 CGLIB 子类化,从而降低了开销和内存占用。spring-doc.cadn.net.cn

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