Springboot不替换application.properties文件中的环境变量

时间:2017-07-20 13:40:56

标签: java spring-boot quartz-scheduler

我正在尝试使用SpringBoot运行Quartz Scheduler。使用Quartz Jdbc数据存储。出于安全原因,我们希望从属性文件中选择Db凭据。根据我从这里(Using env variable in Spring Boot's application.properties)和springBoot文档的理解,SpringBoot自动替换application.properties中的环境变量,但我没有看到这一点。这是我在运行应用程序之前采购的系统环境文件

export DB_HOST=localhost
export DB_PORT=11111
export DB_USER=root
export DB_PASSWORD=root
export QUARTZ_DB_NAME=quartz

这是我的application.properties

org.quartz.dataSource.quartzDataSource.URL =jdbc:mysql://${DB_HOST}:${DB_PORT}/${QUARTZ_DB_NAME}
org.quartz.dataSource.quartzDataSource.user = ${DB_USER}
org.quartz.dataSource.quartzDataSource.password = ${DB_PASSWORD}

我的配置类

@Configuration
public class ConfigureQuartz {

@Autowired
private ApplicationContext applicationContext;

@Bean
public SchedulerFactoryBean schedulerFactoryBean() throws IOException
{
    final SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
    quartzScheduler.setSchedulerName("mdsScheduler");

    quartzScheduler.setQuartzProperties(quartzProperties());
    final AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    quartzScheduler.setJobFactory(jobFactory);
    return quartzScheduler;
}



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

}

但是当我使用java -jar<> .java运行我的spring应用程序时,我没有看到替换值。

我可以通过使用System.getEnv()读取值来解决这个问题,但如果可以替换这些值,则会很好。不知道为什么它不起作用:(

1 个答案:

答案 0 :(得分:-1)

Spring-boot提供了几种提供外部配置的方法,您可以尝试使用application.yml或yaml文件而不是属性文件,并根据不同的环境提供不同的属性文件设置。我们可以为每个环境都放在单独的Spring配置文件下的单独的yml文件中。然后,在部署过程中,您可以使用:

java -jar -Drun.profiles=SpringProfileName

指定要使用的弹簧配置文件。请注意,yml文件的名称应类似于

application-{environmentName}.yml

使它们由springboot自动占用。 参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

要读取application.yml或属性文件:

从属性文件或yml中读取值的最简单方法是使用spring @value注释。Spring自动将yml中的所有值加载到spring环境中,因此我们可以直接使用像这样的环境:

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

或者spring提供的另一种读取强类型bean的方法如下:

YML

acme:
    remote-address: 192.168.1.1
    security:
        username: admin
        roles:
          - USER
          - ADMIN

对应的POJO读取yml:

@ConfigurationProperties("acme")
public class AcmeProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private final Security security = new Security();

    public boolean isEnabled() { ... }

    public void setEnabled(boolean enabled) { ... }

    public InetAddress getRemoteAddress() { ... }

    public void setRemoteAddress(InetAddress remoteAddress) { ... }

    public Security getSecurity() { ... }

    public static class Security {

        private String username;

        private String password;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List<String> getRoles() { ... }

        public void setRoles(List<String> roles) { ... }

    }
}

上述方法适用于yml文件。

参考: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

要从环境中读取内容:

如果您正在Linux上运行应用程序,请按如下所示设置环境:

export DB_HOST=localhost
export DB_PORT=11111
export DB_USER=root
export DB_PASSWORD=root
export QUARTZ_DB_NAME=quartz

如果您在Windows上,则将其设置为:

SET DB_HOST=localhost
SET DB_PORT=11111
SET DB_USER=root
SET DB_PASSWORD=root
SET QUARTZ_DB_NAME=quartz

在application.properties中,如果您保留以下键,它将自动从环境中解析值:

spring.datasource.url = ${DB_HOST}/"nameofDB"
spring.datasource.username = ${DB_USER}
spring.datasource.password = ${DB_PASSWORD}