我在SpringBoot中有简单的MVC应用程序,使用java-config创建(我没有web.xml)
该应用程序具有基于JPA的DB连接。到目前为止,一切都很好,但现在我必须将db.properties从WAR内部移动到OS变量指定的位置(“CONFIG_LOCATION”)。
在spring doc中写的不是太多。只是说它是可行的,但我应该如何在我的Spring应用程序中设置它?
我想应该在初始化程序之前完成。
然后我只看到两个选项:
- SpringApplication - 在某个地方我应该从OS变量插入文件位置,但我找不到它,
- 一些注释,它将低于OS变量,并在创建EntityManager之前将文件从它添加到spring上下文。
我愿意接受我的建议。
答案 0 :(得分:2)
如另一个答案@PropertySource中所述,注释是要走的路(我将添加一些细节)。在Java 8中,您可以多次将它应用于您的配置类,并且顺序很重要!例如,您可以进行此配置:
@SpringBootApplication
@PropertySource("classpath:/db.properties")
@PropertySource(ignoreResourceNotFound = true, value = "file:${MY_APP_HOME}/db.properties")
@PropertySource(ignoreResourceNotFound = true, value = "file:${user.home}/.myapp/db.properties")
@ComponentScan("com.myorg")
public class Application {
// ....
}
这里我假设您应该拥有MY_APP_HOME
环境变量,并且您可能还想在用户主目录中放置一些设置。但由于ignoreResourceNotFound
设置为true,两个配置都是可选的。
还要注意订单。您可以在src/main/resources/db.properties
中为开发环境设置一些合理的设置。并将特定设置放在运行生产服务的主机操作系统中。
查看javadoc中的Resolving ${...} placeholders within @PropertySource resource locations
部分了解详情。
答案 1 :(得分:1)
如果您使用的是spring-boot的配置参数,只需在执行jar或war上指定配置位置,使用参数--spring.config.location。
示例:
$ java -jar myproject.jar --spring.config.location=/opt/webapps/db.properties
答案 2 :(得分:1)
如果您只是希望Spring引用项目根目录下的外部属性文件 这是一个更简单的解决方案:
@Configuration
@PropertySource("file:${user.dir}/your_external_file.properties")
public class TestConfig {
@Autowired
Environment env;
}
如有必要,您可以将$ {user.dir}更改为$ {user.home}。
答案 3 :(得分:0)
好的,我找到了办法。
我创建了返回PropertySourcesPlaceholderConfigurer的类 在那个PSPC中,我获得OS变量,并扫描该位置的所有文件 扫描后,我将所有带有属性扩展名的文件添加到PSCS作为位置 方法是@Bean,类是@Configuration。之后一切正常:)
imports...
@Configuration
public class AppServiceLoader {
@Bean(name = "propLoader")
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
String mainConfigPath = StringUtils.isNotEmpty(System.getenv("CONFIG_LOCATION"))
? System.getenv("CONFIG_LOCATION") : System.getProperties().getProperty("CONFIG_LOCATION");
File configFolder = new File(mainConfigPath);
if(configFolder.isDirectory()) {
FilenameFilter ff = new FilenameFilter() {
@Override
public boolean accept(File file, String string) {
return string.endsWith(".properties");
}
};
File[] listFiles = configFolder.listFiles(ff);
Resource[] resources = new Resource[listFiles.length];
for (int i = 0; i < listFiles.length; i++) {
if(listFiles[i].isFile()) {
resources[i] = new FileSystemResource(listFiles[i]);
}
}
pspc.setLocations(resources);
}
pspc.setIgnoreUnresolvablePlaceholders(true);
return pspc;
}
}
答案 4 :(得分:0)
您还可以使用注释@PropertySource
。它比代码解决方案更清晰,更干净。
例如:
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
...