SpringOne “超越显而易见”演讲中的代码示例

工程 | Joris Kuipers | 2007年6月25日 | ...

上周在 SpringOne 上,Alef 和我做了一个关于使用 Spring 处理复杂应用程序的演讲。在这种情况下,复杂性被认为存在于结构和动态两个层面。关于演讲的结构部分,我在我之前的博客文章中介绍过。动态部分解释了一些处理部署环境之间差异的可能解决方案。(测试、验收、生产等)很多人问我是否可以提供我在演讲期间演示的源代码。我已经将这些源代码附加到此博客条目中,并简要解释了它们的工作原理。希望演讲本身最终会在今年晚些时候发布到parleys.com上,这样您就可以获得有关该主题的更多背景信息。

环境感知:支持您的运行时环境

在演讲中,我论证了通过使用自定义构建脚本(为每个环境生成部署单元)来处理环境之间差异的做法存在一些缺点。其中之一是,当您的应用程序从例如您的验收环境提升到生产环境时,您无法重用构建工件(war 或 ear 文件)。为了解决这些缺点,您必须使您的应用程序环境感知:想办法确定您的应用程序在哪个环境中运行,然后配置您的应用程序以对其做出反应。

有几种方法可以做到这一点:在 Spring 应用程序中,启用环境相关行为的明显方法是为每个需要非默认配置的环境提供不同的 bean 定义。我已经展示了三种方法。

  • 首先是为某些环境加载额外的上下文配置文件。通过使用 bean 定义继承和覆盖,您可以在配置时采取相应的操作。当您使用 ContextLoaderListener 来配置您的 Web 应用程序上下文时,这需要一些额外的代码,这在附加示例中的 Web 项目中显示。顺便说一句,这个想法应该归功于我以前的一位同事(Ezra,谢谢!)。
  • 第二种方法是使用JavaConfig而不是 XML 来定义您的环境相关 bean。然后,确定要创建哪些 bean 的位置从确定要加载哪些配置文件转移到您的 JavaConfig 类。
  • 最后一个示例结合了前两个示例来确定要使用哪个 JavaConfig 类,其中为每个环境创建扩展公共基本配置的子类。这展示了将配置放在实际类中的强大功能:您可以使用常规的 Java 继承和多态性,从而模糊了 bean 定义继承和类继承之间的区别。

其他方法可能包括自定义FactoryBean实现等。

示例

这些示例演示了如何使用一个简单的服务和 DAO,通过名字查找一个人的姓氏。在默认情况下,只定义了两个人(Alef 和我)。在开发环境中,我们将使用一个静态的 DAO 实现,该实现始终返回John Doe。在验收环境中,定义了第三个人(我们的同事 Arjen)。集成测试检查我们的应用程序在每个环境中是否公开了正确的行为。

您可以通过多种方式检查应用程序在哪个环境中运行:对于这些示例,我使用了 EnvironmentUtils 类正在使用的系统属性。例如,其他方法可能是检查数据库或 JNDI 注册表。

我没有简单地压缩我的 Eclipse 工作区,而是创建了一个Maven 示例 更新:Dave Turanski 很好心地更新了示例到 Spring 3.0:有几个人试图说服我最近再给 Maven 一次机会,几年前我曾因对其感到厌恶而放弃了它。我不得不承认,Maven 2 确实比 Maven 1 好得多,尽管对于 Web 项目生成 Eclipse 工作区工件方面还需要改进(例如 WTP 2 支持)。我还错过了其他一些东西,但这可能仅仅是因为我缺乏经验。好消息是我现在不必在我的示例中打包所有依赖项了。

安装 Maven 后,您可以从根目录运行“mvn test”来运行示例测试。要从示例生成 Eclipse 项目,请运行以下命令:“mvn -DdownloadSources=true eclipse:eclipse”。要构建 jar 和 war,请使用“mvn package”或“mvn install”也将构建工件添加到您的本地存储库。

war 包含一个可访问为“/[上下文根]/env”的 servlet:要查看每个环境的差异,请使用名为“app.env”的系统属性启动您的 servlet 容器,该属性包含环境字母(D、T、A 或 P)。因此,在服务器的启动行中添加“-Dapp.env=D”将导致应用程序在开发模式下运行,这意味着所有返回的姓氏都将是“Doe”。

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部