此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 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 容器的各种方法。spring-doc.cadn.net.cn