我正在尝试使用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()读取值来解决这个问题,但如果可以替换这些值,则会很好。不知道为什么它不起作用:(
答案 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}