4

我正在使用带有spring的java。

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

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

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

有人可以解释它是如何工作的吗?

4

4 回答 4

3

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

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 和 jdbc.oracle.host)并使用标志来标识您要使用的数据(您可以将此标志放在系统属性中,例如 -Dcom.abc。 project.model.jdbc.db=sqlserver)。

于 2013-03-12T14:29:41.973 回答
1

在 1 行中: String connUrl = System.getProperty("com.abc.project.model.jdbc.ConnectionUrl", prop.getProperty("com.abc.project.model.jdbc.ConnectionUrl"));

于 2014-12-01T15:46:10.150 回答
0

这是一个基本示例

上下文.xml

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

测试属性

xxx=1

测试.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.properties - 的值1。但是,如果您使用 -Dxxx=2 运行测试,它会打印2. 那就是系统属性覆盖文件中的属性

于 2013-03-12T14:36:48.550 回答
0

看到这个..它解决了spring config本身的问题..无需更改代码

Spring占位符格式

于 2013-05-28T06:19:19.220 回答