领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多上周在 SpringOne 上,Alef 和我做了一个关于使用 Spring 处理复杂应用程序的演讲。在这种情况下,复杂性被认为存在于结构和动态两个层面。关于演讲的结构部分,我在我之前的博客文章中介绍过。动态部分解释了一些处理部署环境之间差异的可能解决方案。(测试、验收、生产等)很多人问我是否可以提供我在演讲期间演示的源代码。我已经将这些源代码附加到此博客条目中,并简要解释了它们的工作原理。希望演讲本身最终会在今年晚些时候发布到parleys.com上,这样您就可以获得有关该主题的更多背景信息。
在演讲中,我论证了通过使用自定义构建脚本(为每个环境生成部署单元)来处理环境之间差异的做法存在一些缺点。其中之一是,当您的应用程序从例如您的验收环境提升到生产环境时,您无法重用构建工件(war 或 ear 文件)。为了解决这些缺点,您必须使您的应用程序环境感知:想办法确定您的应用程序在哪个环境中运行,然后配置您的应用程序以对其做出反应。
有几种方法可以做到这一点:在 Spring 应用程序中,启用环境相关行为的明显方法是为每个需要非默认配置的环境提供不同的 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”。