【问题标题】:Best ways to deal with properties values in XML file in Spring, Maven and Eclipses在 Spring、Maven 和 Eclipses 中处理 XML 文件中的属性值的最佳方法
【发布时间】:2012-10-29 03:05:09
【问题描述】:

正如任何 Spring 程序员都知道的那样,我正在开发一个 Spring WebFlow 项目,该项目在 XML 文件中有很多属性值。我有数据库用户名、密码、URL 等。

我们将 Eclipse 与 Spring WebFlow 和 Maven 结合使用。我们试图让 SA 进行构建,但 SA 不想进入 XML 文件来更改值,但另一方面,我们不知道生产值。我们如何处理这个问题?

【问题讨论】:

  • 查看此问题的已接受答案。我刚刚完成了一些需要将配置外部化的工作;此处引用的解决方案允许使用默认值以及从一个属性文件覆盖它们的简单机制。 stackoverflow.com/questions/13093346/…

标签: eclipse spring svn maven spring-mvc


【解决方案1】:

大多数 SA 更愿意和更有信心处理 .properties 文件而不是 .xml

Spring 提供PropertyPlaceholderConfigurer 让您将所有内容定义到一个或多个.properties 文件中,并替换applicationContext.xml 中的占位符。

src/main/resources/文件夹下创建app.properties

... ...

# Dadabase connection settings:
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/app_db
jdbc.username=app_admin
jdbc.password=password

... ...

并像这样在applicationContext.xml 中使用 PropertyPlaceholderConfigurer:

... ...

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location">
    <value>app.properties</value>
  </property>
</bean>

... ...

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

查看Spring PropertyPlaceholderConfigurer Example了解更多详情。

另外,从应用程序部署的角度来看,我们通常将应用程序打包成某种可执行格式,而.properties 文件通常打包在可执行的war 或ear 文件中。一个简单的解决方案是配置您的 PropertyPlaceholderConfigurer bean 以按照预定义的顺序从多个位置解析属性,因此在部署环境中,您可以使用固定位置或环境变量来指定属性文件,同时注意为了简化SA 的部署/配置任务,我们通常使用单个外部 .properties 文件定义所有运行时配置,如下所示:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <!-- Default location inside war file -->
      <value>classpath:app.properties</value>
      <!-- Environment specific location, a fixed path on server -->
      <value>file:///opt/my-app/conf/app.properties</value>
    </list>
  </property>
  <property name="ignoreResourceNotFound" value="true"/>
</bean>

希望这会有所帮助。

【讨论】:

  • 中型企业通常采用一些策略来限制开发人员访问生产环境,一个常见的软件开发/部署策略是让开发人员开发软件(有原因),构建并打包成可交付的格式,向 SA 提供包部署指令,让 SA 构建/维护硬件基础设施,部署/配置软件和调整性能(CPU、RAM 使用等)。让开发者而不是系统管理员来构建包更合理。
  • 对于从外部位置(外部战争)获取属性文件的第二种解决方案,如果属性发生变化怎么办?我们是否必须重新部署应用程序/重新启动服务器?因为如果我理解正确,属性配置器只会配置一次文件。
【解决方案2】:

另一种简单的方法是 Spring Expression Language (SpEL) 例如

 <property name="url" value="#{ systemProperties['jdbc.url'] }" />

文档 spring documentations

【讨论】:

    【解决方案3】:

    您还可以在配置类中以编程方式定义propertyConfigurer

    @Configuration
    @PropertySource("classpath:application.properties")
    public class PropertiesConfiguration {
    
        @Bean
        public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(Environment env) {
            PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
            configurer.setEnvironment(env);
            return configurer;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 2013-09-27
      • 2018-03-24
      • 2015-02-28
      • 2016-12-08
      • 2022-08-18
      • 2011-01-28
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多