基本概念:@Bean@Configuration

Spring Java 配置支援的核心構件是 @Configuration 註解的類和 @Bean 註解的方法。

@Bean 註解用於指示方法例項化、配置並初始化一個新物件,該物件將由 Spring IoC 容器管理。對於熟悉 Spring <beans/> XML 配置的使用者來說,@Bean 註解與 <bean/> 元素扮演相同的角色。您可以將 @Bean 註解的方法與任何 Spring @Component 一起使用。然而,它們最常與 @Configuration Bean 一起使用。

@Configuration 註解一個類,表明其主要目的是作為 Bean 定義的來源。此外,@Configuration 類允許透過在同一類中呼叫其他 @Bean 方法來定義 Bean 間的依賴關係。最簡單的 @Configuration 類如下所示:

  • Java

  • Kotlin

@Configuration
public class AppConfig {

	@Bean
	public MyServiceImpl myService() {
		return new MyServiceImpl();
	}
}
@Configuration
class AppConfig {

	@Bean
	fun myService(): MyServiceImpl {
		return MyServiceImpl()
	}
}

上述 AppConfig 類等同於以下 Spring <beans/> XML 配置:

<beans>
	<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
@Configuration 類,是否包含 @Bean 方法之間的區域性呼叫?

在常見場景中,@Bean 方法應在 @Configuration 類中宣告,以確保應用完整的配置類處理,並且跨方法引用因此被重定向到容器的生命週期管理。這可以防止同一 @Bean 方法透過常規的 Java 方法呼叫被意外呼叫,從而有助於減少難以追蹤的細微錯誤。

@Bean 方法在未用 @Configuration 註解的類中宣告,或者當聲明瞭 @Configuration(proxyBeanMethods=false) 時,它們被稱為以“lite”模式處理。在這種情況下,@Bean 方法實際上是一種通用的工廠方法機制,沒有特殊的執行時處理(即,不為其生成 CGLIB 子類)。對這種方法的自定義 Java 呼叫不會被容器攔截,因此其行為就像常規方法呼叫一樣,每次都會建立新例項,而不是重用給定 Bean 的現有單例(或作用域)例項。

因此,不進行執行時代理的類中的 @Bean 方法根本不打算宣告 Bean 間的依賴關係。相反,它們應該在其包含元件的欄位上操作,並可選地操作工廠方法可能宣告的引數以接收自動裝配的協作器。因此,這樣的 @Bean 方法永遠不需要呼叫其他 @Bean 方法;每次這樣的呼叫都可以透過工廠方法引數來表達。這裡積極的副作用是,執行時無需應用 CGLIB 子類化,從而減少了開銷和佔用空間。

@Bean@Configuration 註解將在以下章節中深入討論。但是,首先我們將介紹使用基於 Java 的配置建立 Spring 容器的各種方法。

© . This site is unofficial and not affiliated with VMware.