领先一步
VMware 提供培训和认证,助您加速进步。
了解更多这是“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 功能,祝您节日快乐!