22

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

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

4

3 回答 3

46

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

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

创建一个app.propertiessrc/main/resources/文件夹:

... ...

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

... ...

并像这样使用 PropertyPlaceholderConfigurer applicationContext.xml

... ...

<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 示例以获取更多详细信息。

另外,从应用部署的角度来看,我们通常将app打包成某种可执行格式,而.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>

希望这可以帮助。

于 2012-11-08T20:57:40.870 回答
2

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

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

文档 弹簧文档

于 2020-12-23T14:22:58.763 回答
0

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

@Configuration
@PropertySource("classpath:application.properties")
public class PropertiesConfiguration {

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(Environment env) {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setEnvironment(env);
        return configurer;
    }
}
于 2019-11-04T07:19:14.067 回答