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

基本概念:@Bean@Configuration

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

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

使用@Configuration表示其主要用途是作为 bean 定义的来源。此外@Configuration类 let inter-bean dependencies 通过调用其他@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类 确保 full configuration 类处理适用,并且 cross-method 因此,引用将被重定向到容器的生命周期管理。 这可以防止相同的@Bean方法被意外地通过常规的 Java 方法调用,这有助于减少难以追踪的细微错误。spring-doc.cadn.net.cn

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

因此,@Bean没有运行时代理的类上的方法并不意味着 完全声明 bean 间的依赖关系。相反,他们被期望在他们的 包含组件的字段,以及工厂方法可以 declare 以接收自动连接的协作者。这样的@Beanmethod 因此 永远不需要调用其他@Bean方法;每个这样的调用都可以通过以下方式表示 一个工厂方法参数。这里的积极副作用是没有 CGLIB 必须在运行时应用 subclassing,从而减少开销和占用空间。spring-doc.cadn.net.cn

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