Spring Boot - 添加外部属性文件

时间:2015-03-12 15:23:57

标签: java spring-mvc spring-boot configuration-files

我在SpringBoot中有简单的MVC应用程序,使用java-config创建(我没有web.xml) 该应用程序具有基于JPA的DB连接。到目前为止,一切都很好,但现在我必须将db.properties从WAR内部移动到OS变量指定的位置(“CONFIG_LOCATION”)。

spring doc中写的不是太多。只是说它是可行的,但我应该如何在我的Spring应用程序中设置它? 我想应该在初始化程序之前完成。

然后我只看到两个选项:
- SpringApplication - 在某个地方我应该从OS变量插入文件位置,但我找不到它,
- 一些注释,它将低于OS变量,并在创建EntityManager之前将文件从它添加到spring上下文。

我愿意接受我的建议。

5 个答案:

答案 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。它比代码解决方案更清晰,更干净。

请参阅:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html

例如:

@Configuration @PropertySource("classpath:/com/myco/app.properties") public class AppConfig { ...