代码之家  ›  专栏  ›  技术社区  ›  Malax

依赖注入:如何维护多个配置?

  •  1
  • Malax  · 技术社区  · 16 年前

    假设我们已经构建了一个使用DI框架的系统,这个框架工作得很好。该系统目前使用JMS与我们不维护的其他系统进行“对话”。我们的大多数客户都喜欢JMS方法,并根据我们的规范使用它。完成所有消息传递的组件都被注入到应用程序的其余部分中。

    现在我们得到了这样一个例子:一个客户不能实现JMS解决方案,并且想要使用另一种消息传递技术。这不是问题,因为我们可以使用此技术简单地实现消息传递服务,并将其注入到应用程序的其余部分。

    但是我们应该如何处理配置的部署和维护呢?因为应用程序使用了Spring,所以我可以想象为这个应用程序签入所有的配置,并且系统管理员可以启动应用程序并传递DI XML文件的名称来指定应该加载哪个配置。但是…只是感觉不对劲。这种情况有什么解决办法吗?您使用的最佳实践是什么?我甚至可以想象更复杂的场景,其中不只包含一个服务替换…

    谢谢!

    4 回复  |  直到 16 年前
        1
  •  4
  •   alasdairg    16 年前

    然后,另一个建议是:如何将您的Spring配置分成两部分:一个发送给每个人的通用文件和一个包含不同bean定义的特定于部署的文件。所以你可以:

    applicationCommon.xml
    deploymentJMS.xml
    deploymentOtherMessaging.xml
    deploymentDifferentAgainMessaging.xml
    

    然后,当系统管理员部署时,他们选择 关于部署????.xml文件,具体取决于方案并将其放到配置目录中

    您的应用程序将被配置为使用通配符表达式来加载applicationcommon.xml文件和config目录中的任何其他xml文件,同时使用它们来构建应用程序上下文(而不需要特别注意它们是哪个实际文件)。

    不同的部署XML文件将存在于源代码管理中,而sys admins除了知道自己总是部署命名部署之外,不需要任何详细的知识?你说什么?适合该方案的.xml文件。

    (如果是Web应用程序,您可能希望将“config”目录与Web应用程序本身分开,以便重新部署应用程序不会覆盖特定于部署的配置)

    当然,这个部署可以全部编写脚本,以便通过命令行参数选择正确的文件,例如…

        2
  •  3
  •   alasdairg    16 年前

    一种解决方案是在Spring配置中使用PropertyOverrideConfiger。这允许您提供一个单独的属性文件,该文件可以在启动应用程序上下文时覆盖Spring配置中的值。这样,您就可以在applicationcontext.xml中使用标准配置(发送给每个人),以及一个附加的属性文件,该文件允许您在每次部署的基础上自定义配置,而无需更改主配置文件。

    <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
      <property name="location"><value>file:${config.dir}/config.properties</value></property>   
    </bean>
    
        3
  •  1
  •   matt b    16 年前

    对于我们的产品,我们有同样的使用案例。

    我们为每一组配置创建了不同的applicationContext文件集。我们的上下文文件已经分为四个不同的文件( -servlet.xml , -services.xml , -dao.xml 等等),同一“配置套件”中的每个文件在其文件名中共享相同的前缀。

    在这个产品中,我们使用Ant构建部署文件(.war)。我们设置了 build.xml 因此,我们可以将不同的参数传递给构建脚本,以控制打包文件时使用的前缀。例如,我们运行

    ant dist -DtargetApp=app1
    

    使用生成部署文件 app1-dao.xml , app1-services.xml 等,包装。

    在Ant中,我们有类似这样的逻辑来设置要用于“配置套件”名称的属性:

    <target name="set-environment">
        <!-- If the targetApp property is not set, default to "app1" -->
        <condition property="targetApp" value="app1">
            <not>
                <isset property="targetApp"/>
            </not>
        </condition>
        <echo>Using targetApp: ${targetApp}</echo>
    <target>
    

    由于此产品是Web应用程序,因此 ${targetApp} 然后,属性用于筛选web.xml中的值,以告诉Spring要加载哪个应用程序上下文文件。

        4
  •  0
  •   Andreas Dolk    16 年前

    我认为,您要么可以选择发布不同版本的产品,要么继续使用一种支持这两种消息传递系统的产品。

    我倾向于单一产品。如果您不希望客户管理员设置定义消息传递系统的参数,那么您可以提供一个特定于客户的配置文件,或者将该信息附加到您的许可证文件(如果有)中,这样您就可以确保客户使用正确的版本。

    只有当消息传递系统依赖于非免费的第三方库时,我才会构建不同的产品,只是为了防止许可证问题。

    推荐文章