Spring 3.0 中的配置簡化

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

這是由 Keith 昨天開始的關於“Spring 3 簡化”系列文章的第二篇,我想簡要介紹一下 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 匯入該專案。 在這兩種情況下,都使用“檔案”->“匯入”->“將現有專案匯入工作空間”。

首先,讓我們看看 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 的應用程式的一個微不足道的例子。 沒關係,這篇文章的目標只是傳達基本概念。 上面的 @Bean 方法將被 Spring 容器在正確的時間識別和呼叫,並且返回的物件將在 Spring 容器中進行管理,就像任何其他 bean 一樣。 你可以看到,bean 之間的依賴關係可以簡單地表示為一個 bean 方法對另一個 bean 方法的呼叫。 TransferServiceImpl 需要一個 AccountRepository 建構函式引數,所以只需呼叫 accountRepository() 方法即可。

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

正如你所看到的,定義 @Bean 方法非常簡單。 現在,讓我們引導容器並使用這些物件。

看一下 TransferServiceTest JUnit 系統測試及其 transfer100Dollars() @Test 方法。 你首先會注意到的是使用了 AnnotationConfigApplicationContext。 Spring 3 中添加了這種新的 ApplicationContext 實現,以支援直接使用 @Configuration 類例項化 Spring 容器。 該上下文是使用 AppConfig.class 作為建構函式引數建立的,之後我們使用 getBean(Class) 方法按型別檢索 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 (半開玩笑地) 創造了“簡單的舊配置”這個短語。 你可以看看他和 Spring.NET 團隊正在使用他們的類似“CodeConfig”專案做的工作 在這裡

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

取得領先

VMware 提供培訓和認證,以加速你的進步。

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

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

檢視全部