春季启动:带有占位符的属性文件

时间:2019-01-09 15:47:35

标签: java spring spring-boot

我正在使用以下代码加载属性文件:

@Bean
public Properties quartzProperties() throws IOException {
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
    propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
    propertiesFactoryBean.afterPropertiesSet();
    return propertiesFactoryBean.getObject();
}

quartz.properties就像:

org.quartz.jobStore.host = ${jobHost}

我尝试设置jobHost变量application.properties文件:

jobHost = localhost

但它可以吸引我:

  

java.net.UnknownHostException:$ {jobHost}

似乎jobHost尚未解决。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

由于您直接处理Properties,因此${jobHost}不会得到解决。

您可以使用ConfigurationProperties

@Configuration
@PropertySource("classpath:quartz.properties")
@ConfigurationProperties(prefix = "xxx")
public class QuartzConfigProperties {
    // Fields go here
}

@Component
@PropertySource("classpath:quartz.properties")
public class QuartzConfigProperties {

    @Value("${org.quartz.jobStore.host}")
    private String host;

    //getters and setters

}

答案 1 :(得分:0)

将属性存储在多个位置可能会使其他程序员感到困惑。 而且密钥应该唯一以保持一致性 我建议决定从哪个属性文件中读取值。

1。从application.properties中读取 在此处查看示例:

How to access a value defined in the application.properties file in Spring Boot

按照@Eugen Covaci与@Component的建议从任何@Value访问它:

@Value("${org.quartz.jobStore.host}")
private String name;

2。从quartz.properties中读取 这样,您就可以打开新属性(如果您创建了单独的属性文件,我想您会拥有更多的属性)。 请参阅下面的示例:

QuartzProperties POJO(每个字段都是一个属性)

    public class QuartzProperties {

    private String jobHost;

    public String getJobHost() { return jobHost; }

    public void setJobHost(String jobHost) { this.jobHost = jobHost; }
}

配置类

@Configuration
@PropertySource("classpath:quartz.properties")
public class QuartzConfig {
    @Value("${org.quartz.jobStore.host}")
    String jobHost;
    //other properties for Quartz here
    @Bean
    public QuartzProperties quartzProperties(){
        QuartzProperties quartzProperties = new QuartzProperties();
        quartzProperties.setJobHost(jobHost);
        //setters for other properties here
        return quartzProperties;
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer properties(){
        return new PropertySourcesPlaceholderConfigurer();
    }
}

通过@Component中的任何quartzProperties.getJobHost()访问它。

我只是将其命名为quartzProperties和QuartzConfig,但它可以是jobStoreProperties或JobStoreConfig。取决于这些属性的目的。

或者,如果您要创建2个配置文件(例如,开发和测试),可以按照Spring YAML Configuration

创建它们

或者您可以将配置外部化为环境变量/将其作为命令行参数传递。 Externalized Configuration