Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提供外部应用程序上下文配置属性?_Java_Spring_Configuration - Fatal编程技术网

Java 如何提供外部应用程序上下文配置属性?

Java 如何提供外部应用程序上下文配置属性?,java,spring,configuration,Java,Spring,Configuration,我有一个web应用程序,它使用包含某种属性的外部配置文件,这些属性是在加载应用程序上下文之前加载的: public class StartupListener extends org.springframework.web.context.ContextLoaderListener { @Override public void contextInitialized(ServletContextEvent event) { com.acme.ap

我有一个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>
但我只知道两种方法:

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

C:\anotherConfig.properties:

db.user=...
db.password=...
System.setProperty("db.user",
        configuration.getDatabaseConfig().getUser());
System.setProperty("db.password",
        configuration.getDatabaseConfig().getPassword());
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>
<beans ...>
    ...
    <context:property-placeholder location="file:C:/anotherConfig.properties"/>
    ...
</beans>
<beans ...>
    ...
    <context:property-placeholder-provider ref="myPropertiesProvider"/>
    <bean id="myPropertiesProvider" class="com.acme.app.MyPropertiesProvider"/>
    ...
</beans>
这两个对我来说都不好(尤其是第一个)

有没有什么方法可以让这更像春天?也许是这样:

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 ...>
    ...
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        ...
        <property name="username" value="${db.user}"/>
        <property name="password" value="${db.password}"/>
        ...
    </bean>
    ...
</beans>
<beans ...>
    ...
    <context:property-placeholder location="file:C:/anotherConfig.properties"/>
    ...
</beans>
<beans ...>
    ...
    <context:property-placeholder-provider ref="myPropertiesProvider"/>
    <bean id="myPropertiesProvider" class="com.acme.app.MyPropertiesProvider"/>
    ...
</beans>

...
...
  • 为每个环境创建属性文件
  • 将所有环境包括在您的部署归档中(Maven assembly插件可以为 你),
  • 创建一个部署脚本,以便可以使用单个 参数(目标环境),并让坐标将正确的配置移动到每个文件夹中的正确目标位置(或运行application server CLI,或按需推送数据库更改)
  • 将连续传送系统配置为运行 在使用正确的 目标环境的参数
要帮助生成属性、配置、脚本等,请查看Maven Central上提供的此插件: