如何从系统变量设置Spring配置文件?

我有一个使用另一个项目的Spring项目。 每个项目都有自己的spring profile,使用applicationContext.xml*.properties为每个配置文件初始化java代码。 我从args[]注入配置文件。 问题是第二个项目使用 applicationContext.xml env的默认配置我无法将args[]的env注入第二个项目,我试着找一篇文章来解释Spring profile的工作原理。

  1. applicationContext.xml未配置默认值时,是否存在将查看配置文件的层次结构?
  2. System var是否比applicationContext.xml配置更强大?
  3. 您认为什么是我挑战的最佳解决方案?

有关该主题甚至实例的文章将非常受欢迎!! 提前致谢。

SPRING_PROFILES_ACTIVE是覆盖/选择Spring配置文件的环境变量

如果您为JVM提供Spring配置文件,那么应该没有问题:

 java -Dspring.profiles.active=development -jar yourApplication.jar 

另见Spring-Documentation:

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

69.5设置活动的弹簧配置文件

Spring Environment有一个API,但通常你会设置一个System属性(spring.profiles.active)或一个OS环境变量(SPRING_PROFILES_ACTIVE)。 例如,使用-D参数启动应用程序(记得将它放在主类或jar存档之前):

$ java -jar -Dspring.profiles.active = production demo-0.0.1-SNAPSHOT.jar

在Spring Boot中,您还可以在application.properties中设置活动配置文件,例如

spring.profiles.active =生产

以这种方式设置的值将由System属性或环境变量设置替换,但不会由SpringApplicationBuilder.profiles()方法替换。 因此,后一个Java API可用于扩充配置文件而不更改默认值。

有关详细信息,请参见“Spring Bootfunction”一节中的第25章“配置文件”。

我通常使用基于注释的配置而不是基于XML的配置来配置applicationContext。 无论如何,我相信他们两个都有同样的优先权

*回答你的问题,系统变量具有更高的优先级*


从applicationContext获取基于配置文件的bean

  • 在Bean上使用@Profile

     @Component @Profile("dev") public class DatasourceConfigForDev 

    现在,配置文件是dev

    注意:如果配置文件是@Profile("!dev")那么配置文件将排除dev并且适用于所有其他配置文件。

  • 在XML中使用profiles属性

        

设置配置文件的值:

  • 通过WebApplicationInitializer接口以编程方式

    在Web应用程序中,WebApplicationInitializer可用于以编程方式配置ServletContext

     @Configuration public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { servletContext.setInitParameter("spring.profiles.active", "dev"); } } 
  • 通过ConfigurableEnvironment以编程方式

    您还可以直接在环境中设置配置文件:

     @Autowired private ConfigurableEnvironment env; ... env.setActiveProfiles("dev"); 
  • web.xml中的Context参数

    也可以使用context参数在Web应用程序的web.xml中激活配置文件:

      contextConfigLocation /WEB-INF/app-config.xml   spring.profiles.active dev  
  • JVM系统参数

    在应用程序启动期间将激活作为参数传递的配置文件名称:

     -Dspring.profiles.active=dev 

    在IDE中,您可以设置应用程序运行时要使用的环境变量和值。 以下是Eclipse中的运行配置:

Eclipse Run Configuration  - 截图不可用

  • 环境变量

    通过命令行设置: export spring_profiles_active=dev

任何未指定配置文件的bean都属于“默认”配置文件。


优先顺序是:

  1. web.xml中的Context参数
  2. WebApplicationInitializer
  3. JVM系统参数
  4. 环境变量

我的解决方案是将环境变量设置为spring.profiles.active=development 。 这样,在该机器上运行的所有应用程序都将引用变量并启动应用程序。 弹簧加载属性的顺序如下

 application.properties system properties environment variable 

如果我运行命令行: java -Dspring.profiles.active=development -jar yourApplication.jar from webapplication directory,它表明路径不正确。 所以我只是在application.properties文件中手动定义了配置文件,如下所示:

 spring.profiles.active=mysql 

要么

 spring.profiles.active=postgres 

要么

 spring.profiles.active=mongodb 

如果您使用docker来部署spring boot应用程序,则可以使用标志e设置配置文件

docker run -e“SPRING_PROFILES_ACTIVE = prod”-p 8080:8080 -t r.test.co/myapp:latest