Spring 3.0 中的配置簡化

工程 | Chris Beams | 2009年12月22日 | ...

這是“Spring 3 簡化”系列帖子的第二篇,該系列由 Keith 於昨天開始。我想提供一個非常簡短且實用的介紹,關於 Spring 新的 @Configuration 註解和相關支援。

正如那些關注 Spring JavaConfig 專案的人所知,一個帶 @Configuration 註解的類扮演著與 Spring XML 檔案非常相似的角色。它提供了一種以程式碼為中心的方式,僅使用方法和註解來宣告 Spring bean 定義。您可以稱之為純粹的配置* :) 這意味著對於簡單的情況,無需 XML!

開始吧。為了演示 @Configuration 功能,我在新的 spring-samples SVN 儲存庫中建立了一個非常簡單的專案。您現在可以同步並構建它。您需要一個 Subversion 客戶端和一個最新版本的 Maven。

svn co https://src.springframework.org/svn/spring-samples/configuration-basic/trunk configuration-basic cd configuration-basic mvn clean test [...] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------

Eclipse 的 .classpath 和 .project 元資料也包含在檢出中,因此您可以使用SpringSource Tool Suite或安裝了m2eclipse 外掛的任何最新版本的 Eclipse 來匯入專案。在這兩種情況下,都請使用 File->Import->Existing Projects into Workspace。

首先,讓我們看一下AppConfig.java。這個帶 @Configuration 註解的類在基於 XML 的 Spring 應用程式中扮演著與 app-config.xml 相同的作用。在審查專案時,這是一個不錯的起點,因為它充當了執行時物件例項如何被連線和管理的“藍圖”。


@Configuration
public class AppConfig {

    public @Bean TransferService transferService() {
        return new TransferServiceImpl(accountRepository());
    }

    public @Bean AccountRepository accountRepository() {
        return new InMemoryAccountRepository();
    }

}

誠然,這是一個非常簡單的應用程式示例,甚至沒有真正的 JDBC DataSource。沒關係,這篇文章的目標只是傳達基本概念。Spring 容器將在正確的時間識別並呼叫上面的 @Bean 方法,並且返回的物件將被 Spring 容器管理,就像任何其他 bean 一樣。您可以看到 bean 之間的依賴關係可以簡單地表示為從一個 bean 方法到另一個方法的呼叫。TransferServiceImpl 需要一個 AccountRepository 建構函式引數,因此只需呼叫 accountRepository() 方法即可。

然而,精明的 Spring 使用者會看到這個場景,並問“bean 的作用域是什麼?” 這是一個好問題。如您所知,所有 Spring bean 都有一個作用域。預設情況下,bean 的作用域是“singleton”(單例),這意味著每個 Spring 容器只有一個該 bean 的例項。看看上面的程式碼,似乎如果我們多次呼叫 accountRepository(),我們實際上會建立多個例項,但這實際上並非如此!當 @Configuration 類在執行時被處理時,它會被動態地建立子類(使用 CGLIB),並且 @Bean 方法的子類實現會得到增強,以確保作用域語義得到尊重。

如您所見,定義 @Bean 方法非常直接。現在,讓我們引導容器並使用這些物件。

看看TransferServiceTest JUnit 系統測試及其 transfer100Dollars() @Test 方法。您會注意到的第一件事是使用了AnnotationConfigApplicationContext。這個新的 ApplicationContext 實現已新增到 Spring 3 中,以支援直接使用 @Configuration 類例項化 Spring 容器。上下文是透過將 AppConfig.class 作為建構函式引數建立的,之後我們透過getBean(Class<T>)方法按型別檢索 TransferService 和 AccountRepository bean。該方法的其餘部分只是標準的 JUnit 斷言,用於測試 TransferService 和 AccountRepository API,確保一切按預期工作。


public class TransferServiceTest {

    @Test
    public void transfer100Dollars() {
        // create the spring container using the AppConfig @Configuration class
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

        // retrieve the beans we'll use during testing
        AccountRepository accountRepository = ctx.getBean(AccountRepository.class);
        TransferService transferService = ctx.getBean(TransferService.class);

        // create accounts to test against
        accountRepository.add(new Account("A123", 1000.00));
        accountRepository.add(new Account("C456", 0.00));

        // check account balances before transfer
        assertThat(accountRepository.findById("A123").getBalance(), equalTo(1000.00));
        assertThat(accountRepository.findById("C456").getBalance(), equalTo(0.00));

        // perform transfer
        transferService.transfer(100.00, "A123", "C456");

        // check account balances after transfer
        assertThat(accountRepository.findById("A123").getBalance(), equalTo(900.00));
        assertThat(accountRepository.findById("C456").getBalance(), equalTo(100.00));
    }

}

就是這樣!簡單、純粹的 Java、型別安全的配置。我們希望您會發現這是 Spring 核心依賴注入支援的一項便捷而強大的補充。

當然,今天我們只是觸及了表面。@Configuration 類還有更多可以做的事情,我們將在未來的文章中探討這些功能。但不要等我——您現在就可以透過閱讀 Spring 3 參考文件的@Configuration 部分來自己檢視所有內容。**我鼓勵每個人都使用這個示例專案作為起點,您可以從中快速試用所有這些新支援**。

我期待您的反饋。享受使用 @Configuration 和所有新的 Spring 3 功能,祝您節日快樂!

  • 感謝 Erich Eichinger (半開玩笑地)創造了“Plain Old Configuration”(普通舊配置)這個短語。您可以在這裡檢視他和 Spring.NET 團隊在他們類似的“CodeConfig”專案中所做的工作。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有