基本概念:@Bean@Configuration

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

@Bean 註解用於指示某個方法例項化、配置並初始化一個新物件,該物件將由 Spring IoC 容器管理。對於熟悉 Spring <beans/> XML 配置的人來說,@Bean 註解扮演的角色與 <bean/> 元素相同。你可以在任何 Spring @Component 中使用帶有 @Bean 註解的方法。但是,它們最常與 @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>
帶或不帶 @Bean 方法之間本地呼叫的 @Configuration 類?

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

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

因此,沒有執行時代理的類中的 @Bean 方法根本不用於宣告 bean 之間的依賴關係。相反,它們應操作其包含元件的欄位,並且可以選擇操作工廠方法可能宣告的引數以接收自動裝配的協作者。因此,這樣的 @Bean 方法永遠不需要呼叫其他 @Bean 方法;每個這樣的呼叫都可以透過工廠方法引數來表達。這樣做的積極副作用是執行時無需應用 CGLIB 子類化,從而降低了開銷和佔用空間。

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