【问题标题】:How do I provide external application context configuration properties?如何提供外部应用程序上下文配置属性?
【发布时间】:2014-06-25 03:58:17
【问题描述】:

我有一个 Web 应用程序,它使用包含某种属性的外部配置文件,这些属性是在应用程序上下文加载之前加载的:

public class StartupListener
        extends org.springframework.web.context.ContextLoaderListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        com.acme.app.Configuration configuration
                = com.acme.app.Configuration.loadFromFile("C:/config.xml");
        // String dbUser = configuration.getDatabaseConfig().getUser();
        // String dbPassword = configuration.getDatabaseConfig().getPassword();

        super.contextInitialized(event);
    }

}

C:\config.xml:

<config xmlns="http://www.acme.com/app/config">
    ...
    <databaseConfig>
        <user>...</user>
        <password>...</password>
    </databaseConfig>
    ...
</config>

web.xml:

<web-app ...>
    ...
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    ...
    <listener>
        <listener-class>com.acme.app.StartupListener</listener-class>
    </listener>
    ...
</web-app>

applicationContext.xml:

<beans ...>
    ...
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        ...
        <property name="username" value="${db.user}"/>
        <property name="password" value="${db.password}"/>
        ...
    </bean>
    ...
</beans>

我想在 ${db.user}${db.password} 属性可用后将它们推送到上下文中:

com.acme.app.Configuration configuration
        = com.acme.app.Configuration.loadFromFile("C:/config.xml");
String dbUser = configuration.getDatabaseConfig().getUser();
String dbPassword = configuration.getDatabaseConfig().getPassword();

但我只知道两种方法:

1) 再创建一个配置文件为 .properties 文件:

C:\anotherConfig.properties:

db.user=...
db.password=...

applicationContext.xml:

<beans ...>
    ...
    <context:property-placeholder location="file:C:/anotherConfig.properties"/>
    ...
</beans>

2) 或向系统属性添加属性:

System.setProperty("db.user",
        configuration.getDatabaseConfig().getUser());
System.setProperty("db.password",
        configuration.getDatabaseConfig().getPassword());

这两个对我来说都不好(尤其是第一个)。

有没有什么方法可以让这更像 Spring?可能是这样的:

public class MyPropertiesProvider
        implements org.springframework.foo.bar.PropertiesProvider {

    @Override
    public Properties getProperties() {
        Properties properties = new Properties();
        com.acme.app.Configuration configuration
                = com.acme.app.Configuration.loadFromFile("C:/config.xml");
        properties.setProperty("db.user",
                configuration.getDatabaseConfig().getUser());
        properties.setProperty("db.password",
                configuration.getDatabaseConfig().getPassword());
        return properties;
    }

}

applicationContext.xml:

<beans ...>
    ...
    <context:property-placeholder-provider ref="myPropertiesProvider"/>
    <bean id="myPropertiesProvider" class="com.acme.app.MyPropertiesProvider"/>
    ...
</beans>

【问题讨论】:

    标签: java spring configuration


    【解决方案1】:
    • 为每个环境创建一个属性文件
    • 在部署存档中包含所有环境(Maven 程序集插件可以为 你),
    • 创建一个部署脚本,这样您就可以使用一个单一的运行所有设置 参数(目标环境)并让坐标将正确的配置移动到每个文件夹中的正确目标位置(或运行应用程序服务器 CLI,或推送数据库更改,无论您需要什么)
    • 配置您的持续交付系统以运行 使用权限复制工件后的部署脚本 目标环境的参数。

    要帮助生成属性、配置、脚本等,请查看 Maven Central 上提供的此插件:https://github.com/sofdes/config-generation-maven-plugin

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2015-07-03
      • 2015-08-31
      相关资源
      最近更新 更多