Java jvm选项覆盖属性文件中的属性



我正在使用java与spring。

我有一个独立的应用程序,其属性文件包含数据库连接url。

由于某种原因,如果我想覆盖一个属性,我看到一些地方我们可以通过传递属性和它的值来覆盖属性,通过传递它作为jvm选项。

java -Dcom.abc.project.model.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://abc-al01.abc.com/model_QA [executeablejar] myjavafile

谁能解释一下它是怎么工作的?

你想从属性文件中加载一些数据库相关的数据,但你想实现一个功能,用系统属性数据覆盖这些数据,为什么你不能这样做呢?

Properties prop = new Properties();
try {
    prop.load(new FileInputStream("config.properties"));
    String connUrl = prop.getProperty("com.abc.project.model.jdbc.ConnectionUrl");
    String theOtherConnUrl = System.getProperty("com.abc.project.model.jdbc.ConnectionUrl");
    if(theOtherConnUrl!=null){
        connUrl = theOtherConnUrl;
           ...

我相信重写行为将取决于你实现代码的方式,将从属性文件和系统属性中检索这些数据,为什么不把所有数据库相关的数据留在单个属性文件中(多个连接数据由不同的参数名称分开,例如,jdbc.sqlserver.host &;

使用一个标志来标识你想使用的数据(你可以把这个标志放在系统属性中,例如-Dcom.abc.project.model.jdbc.db=sqlserver)。

:String connUrl = System.getProperty("com.abc.project.model.jdbc. properties ")。ConnectionUrl, prop.getProperty("com.abc.project.model.jdbc.ConnectionUrl"));

下面是一个基本的例子

context.xml

<context:property-placeholder location="/test.properties" system-properties-mode="OVERRIDE"/> 
<bean class="Test">
    <property name="xxx" value="${xxx}" />
</bean>

test.properties

xxx=1

Test.java

public class Test {
    public void setXxx(String xxx) {
        System.out.println(xxx);
    }
    public static void main(String[] args) throws Exception {
        new ClassPathXmlApplicationContext("context.xml");
    }
}

最初Test打印Test的值。属性- 1 . properties但是如果使用-Dxxx=2运行Test,它将打印2。即系统属性覆盖文件

中的属性

看这个…它解决了spring配置本身的问题。无需更改代码

Spring占位符格式

最新更新