从动态更新的Application.properties中读取

时间:2018-08-28 12:26:05

标签: java spring

我有应用程序属性文件,该文件正在使用maven构建步骤动态更新。

  

mvn clean -Dusername = user1 -Durl = xxxx -Dpassword = xxxx -DskipTests   安装

jdbc.url=${url}
jdbc.username=${username}
jdbc.password=${password}

我正在配置类中读取这些属性

@Configuration 
@ImportResource("classpath:/spring-beans.xml")
@PropertySource("classpath:/application.properties")
public class ApplicationConfiguration {

  @Value("${jdbc.url}")
  private String url;

 @Value("${jdbc.username}")
  private String username;

 @Value("${jdbc.password}")
 private String password;

@Bean(name = "c3p0DataSource")
public ComboPooledDataSource dataSource() throws PropertyVetoException, 
IOException {

logger.info("Creating Datasource for {}",System.getenv("SPRING_DATASOURCE_URL"));
// logger.info("Creating Datasource for username {}", 
prop.getProperty("username"));
logger.info("Creating Datasource for {}", System.getenv("username"));
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");

logger.info("User Name :" + username);//returning $username instead of user1

logger.info("password :" + password);

System.out.println("User name : " + username);

dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;  }   }

我没有获得更新的值,而是获得了$ username,$ password作为值,有人可以帮助我在这里缺少的内容吗?

我修改后的属性文件如下所示

jdbc.url=xxxx
jdbc.username=user1
jdbc.password=xxxx

4 个答案:

答案 0 :(得分:0)

我建议您不要使用Spring的application属性,而建议您使用另一个属性文件,将其存储在文件系统上,并使用org.apache.commons.configuration.PropertiesConfiguration类从该文件中加载值。

org.apache.commons.configuration.PropertiesConfiguration能够在更改时重新加载属性文件。

https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html

如果您使用的是maven,请添加以下依赖项。

<dependency>
    <groupId>commons-configuration</groupId>
    <artifactId>commons-configuration</artifactId>
    <version>1.10</version>
</dependency>

答案 1 :(得分:0)

在我看来,“动态更新”是指在构建时而非运行时进行更新。如果是这样,那么you need to use the maven resources plugin, define the maven variables and use a different syntax in the properties file.是Spring Boot文档的c overed in the properties and configuration section

答案 2 :(得分:0)

您应该跑步

mvn clean -Djdbc.username=user1 -Djdbc.url=xxxx -Djdbc.password=xxxx -DskipTests install

答案 3 :(得分:0)

我尝试过手动初始化数据,这可以工作。您也可以尝试一下。

您可以尝试以下代码:

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Configuration;


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

    private Properties properties = new Properties();
    public static String driverClass;
    public static String dataSourceUrl;
    public static String dataSourceUser;
    public static String dataSourcePassword;

    public ApplicationConfiguration() throws IOException {
        properties.load(new InputStreamReader(ApplicationConfiguration.class.getResourceAsStream("/application.properties")));    
        driverClass = properties.getProperty("spring.datasource.driver-class-name");
        dataSourceUrl = properties.getProperty("spring.datasource.url");
        dataSourceUser = properties.getProperty("spring.datasource.username");
        dataSourcePassword = properties.getProperty("spring.datasource.password");
  }

  // Other Code Details

}

现在,我可以像ApplicationConfiguration.driverClassApplicationConfiguration.dataSourceUser这样轻松地使用它。

我从application.properties中也使用了很少的其他资源,这些资源不是我手动进行初始化的,在building jar期间也不需要。因此,只有我使用@PropertySource("classpath:application.properties")来使用其他资源,而无需手动初始化。

尝试一次,它可能会对您有帮助:)