此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

基本概念:@Bean@Configuration

Spring 的 Java 配置支持中的核心工件是@Configuration-annotated 类和@Bean-annotated 方法。spring-doc.cadn.net.cn

@Bean注释用于指示方法实例化、配置和 初始化一个要由 Spring IoC 容器管理的新对象。对于那些熟悉的人 与 Spring 的<beans/>XML 配置,则@Bean注释的作用与 这<bean/>元素。您可以使用@Bean-annotated 方法与任何 Spring@Component.但是,它们最常与@Configuration豆。spring-doc.cadn.net.cn

使用@Configuration表示其主要用途是作为 bean 定义的来源。此外@Configuration类让 bean 间 依赖关系通过调用 other@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()
	}
}

前面的AppConfigclass 相当于下一个 Spring<beans/>XML:spring-doc.cadn.net.cn

<beans>
	<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
@Configuration@Bean方法之间有或没有本地调用的类?

在常见场景中,@Bean方法应在@Configuration类 确保完整的配置类处理适用,并且跨方法 因此,引用将重定向到容器的生命周期管理。 这可以防止相同的@Bean方法不会通过常规 Java 方法调用,这有助于减少难以追踪的细微错误。spring-doc.cadn.net.cn

什么时候@Bean方法在未用@Configuration,或当@Configuration(proxyBeanMethods=false)被声明, 它们被称为以“精简”模式进行处理。在这种情况下,@Bean方法实际上是一种通用的工厂方法机制,无需 特殊的运行时处理(即,不为其生成 CGLIB 子类)。 对此类方法的自定义 Java 调用不会被容器拦截,并且 因此,其行为就像常规方法调用一样,每次都会创建一个新实例 而不是为给定的 bean 重用现有的单例(或作用域)实例。spring-doc.cadn.net.cn

结果,@Bean没有运行时代理的类上的方法并不意味着 声明 Bean 间依赖项。相反,他们应该在他们的 包含组件的字段,并且(可选)在工厂方法可能的参数上 声明以接收自动连线协作者。这样的@Bean方法因此 永远不需要调用其他@Bean方法;每个这样的调用都可以通过 一个工厂方法参数。这里的积极副作用是没有 CGLIB 子类化必须在运行时应用,从而减少开销和占用空间。spring-doc.cadn.net.cn

@Bean@Configuration以下部分将深入讨论注释。 然而,首先,我们介绍了使用 基于 Java 的配置。spring-doc.cadn.net.cn