【问题标题】:Web app with Spring: how externalize properties file?带有 Spring 的 Web 应用程序:如何外部化属性文件?
【发布时间】:2018-03-10 09:01:05
【问题描述】:

我在服务器 Tomcat 上使用 Spring 框架构建了一个 J2EE Web 应用程序,我的应用程序需要读取一些我需要在外部的属性(如 jdbs 连接参数、文件夹路径等)。 我的意思是今天我把罐子放在服务器上。如果在 2 年内连接数据库参数或我要使用的文件夹发生变化,我不想重新部署应用程序,只需更改属性文件即可。

我现在拥有的是类路径中的一个 .properties 文件,以及一个读取它的 bean:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:database.properties"/>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="url" value="${jdbc.url}" />
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

database.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cheExport?useSSL=false
jdbc.username=root
jdbc.password=root

我怎样才能实现我的目的?

如果我没记错的话,我可以在服务器 xml 中做一些事情,我可以在其中指定某个文件夹包含属性文件。但是我怎样才能把这些东西放在一起呢?

在这篇文章中Read properties file outside JAR file 被问到同样的问题,但没有使用 Spring,所以我认为它对我来说没用

我还了解到在这种情况下使用 Spring Boot 很常见,但我使用的是 Spring MVC

【问题讨论】:

    标签: java spring tomcat properties configuration


    【解决方案1】:

    您使用 util 属性。给你看看我的示例代码。

    root-context.xml

    <util:properties id="config"
        location="classpath:config/config.properties" />
    
    <bean id="officeDataSource"
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="#{config['driverClass']}" />
        <property name="url" value="#{config['commonUrl']}" />
        <property name="username" value="#{config['username']}" />
        <property name="password" value="#{config['password']}" />
    </bean>
    

    config.properties

    driverClass=org.mariadb.jdbc.Driver
    commonUrl=jdbc:mariadb://123.345.563.16:3306/FACE_BOOK_DB?useUnicode=yes&amp;characterEncoding=UTF-8
    
    username=id
    password=pw
    

    为您的项目结构图像。项目中存在资源(web-inf-classes-config)。

    【讨论】:

    • 我不明白的是:是否可以在 location="classpath" 中放入 jar 外部的文件?我的意思是,我想在服务器上放置一个包含 .jar 的文件夹:root/myApp.jar,然后在同一文件夹中放置属性文件:root/database.properties
    • 我试过了,但我仍然不明白它是如何工作的:我获得了一个 jar 和 .properties 文件(我将它完全放在同一个位置,在 src/main/resources 下)是在jar里面,在WEB-INF/classes/config文件夹下,所以不能修改。
    • 为什么要放jar?仅读取或使用属性文件。 Spring MVC 非常有用。