将文件中的值读入 applicationContext.xml 文件

Posted

技术标签:

【中文标题】将文件中的值读入 applicationContext.xml 文件【英文标题】:Reading value from file into applicationContext.xml file 【发布时间】:2019-10-22 18:30:29 【问题描述】:

我有一个基于 Spring 的 Web 应用程序,在我的应用程序上下文 xml 文件中,我定义了一个 bean,它具有连接到数据库的所有参数。作为此 bean 的一部分,对于其中一个参数,我有一个密码密钥,如下例所示,我希望该值应来自 /vault/password 文件。此 /vault/password 不是项目/应用程序的一部分。默认情况下,此 /vault/password 将存在于主机中。

applicationContext.xml bean 定义中的语法是什么,从应用程序上下文之外的文件中读取值。

<bean class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" id="dataSource">
    <property name="url" value="jdbc:postgresql://postgres:5432/" />
    <property name="username" value="postgres" />
    <property name="password" value="/vault/password" />
</bean>

【问题讨论】:

我认为您真的在问这个问题:“Flyway bean 如何从外部文件读取密码以进行身份​​验证?”。 这与飞路豆无关。我的具体问题是,bean dataSource 中属性名称密码的值应该从文件中读取,例如 /vault/password 您的应用程序上下文在“applicationContext.xml”(或等效项)中初始化,但是某处有一些Java 对象在使用它。您不能修改 .xml 以某种方式“读取”外部文件。关键是你需要用Java来做。 那么什么是 Java 对象??? 【参考方案1】:

这样的事情可能是你最好的选择:

How to correctly override BasicDataSource for Spring and Hibernate

问题:

现在我需要提供基于服务器环境的自定义数据源 (不是配置),为此我需要计算 driverClassName 和 url 基于某些条件的字段。

解决方案:

创建工厂(因为您只需要自定义创建阶段 对象,你不需要控制它的整个生命周期)。

 public class MyDataSourceFactory 
    public DataSource createDataSource() 
        BasicDataSource target = new BasicDataSource();
        if (condition) 
            target.setDriverClassName("com.mysql.jdbc.Driver");                
            target.setUrl("jdbc:mysql://localhost/test?relaxAutoCommit=true"); 
         else  ... 
        return target;
    

在您的情况下,您的自定义会做一些 I/O 来设置 target.password

【讨论】:

上述解决方案有效。惊人的。答案是编写自定义 MyDataSourceFactory 并在应用程序上下文文件中提供该工厂引用。

以上是关于将文件中的值读入 applicationContext.xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

将文件中的值读入数组会导致分段错误,C

将文件中的双值数字读入 C++ 中的向量并访问它们的值

将文件中的键/值参数读入 shell 脚本

如何从 JSON 文件读入 JavaScript? [复制]

C getline() - 如何处理缓冲区/如何将未知数量的值读入数组

将 .properties 文件中的值设置为 web.xml