春季启动 - 添加外部属性文件(Spring Boot - add external propert

2019-10-22 05:42发布

我在SpringBoot简单的MVC应用程序,使用Java的配置创建(我没有web.xml中)。
该应用程序有一个基于JPA的数据库连接。 到现在为止,一切是伟大的,但现在我必须从战争的内部移动db.properties由OS变量(“CONFIG_LOCATION”)指定的位置。

在春天文档写入有关不太多。 还有就是只能说这是更多钞票,但是我应该如何设置,在我的Spring应用程序?
我想,应该初始化之前完成。

然后,我看到的只有两个选择:
- SpringApplication - 是在某个地方,我应该插入来自OS变量文件位置的地方,但我不能找到它,
- 一些注释,这将understond OS变量,并从中文件添加到Spring上下文将创建一个EntityManager之前。

我接受建议,我应该怎么做。

Answer 1:

作为另一个答复中提到@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环境变量,也可能你要放置在用户家里的一些设置。 但两者的configs是可选的,因为ignoreResourceNotFound设置为true。

另外要注意的顺序。 您可能必须在开发环境中的一些合理设置src/main/resources/db.properties 。 并把在您的生产服务运行主机操作系统的具体设置。

看看Resolving ${...} placeholders within @PropertySource resource locations节的javadoc了解详情。



Answer 2:

如果使用的是弹簧启动的配置参数,它只是指定上执行罐子或战争,与参数--spring.config.location的配置位置。

例:

$ java -jar myproject.jar --spring.config.location=/opt/webapps/db.properties



Answer 3:

如果你只是想春天引用外部性项目根目录下的文件。
这里有一个简单的解决方案:

@Configuration
@PropertySource("file:${user.dir}/your_external_file.properties")
public class TestConfig {
  @Autowired
  Environment env;
}

如有必要,您可以更改$ {user.dir来}至$ {}的user.home。



Answer 4:

好吧,我发现了一种方法。

我创建的类什么回报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;

    }
}


Answer 5:

您还可以使用注释@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 { ...



文章来源: Spring Boot - add external property files