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 社区所有即将举行的活动。

查看所有