如何从系统变量设置Spring配置文件?
我有一个使用另一个项目的Spring项目。 每个项目都有自己的spring profile,使用applicationContext.xml
和*.properties
为每个配置文件初始化java代码。 我从args[]
注入配置文件。 问题是第二个项目使用 applicationContext.xml
env的默认配置我无法将args[]
的env注入第二个项目,我试着找一篇文章来解释Spring profile的工作原理。
- 在
applicationContext.xml
未配置默认值时,是否存在将查看配置文件的层次结构? - System var是否比
applicationContext.xml
配置更强大? - 您认为什么是我挑战的最佳解决方案?
有关该主题甚至实例的文章将非常受欢迎!! 提前致谢。
SPRING_PROFILES_ACTIVE是覆盖/选择Spring配置文件的环境变量
如果您为JVM提供Spring配置文件,那么应该没有问题:
java -Dspring.profiles.active=development -jar yourApplication.jar
另见Spring-Documentation:
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中的运行配置:
-
环境变量
通过命令行设置:
export spring_profiles_active=dev
任何未指定配置文件的bean都属于“默认”配置文件。
优先顺序是:
- web.xml中的Context参数
- WebApplicationInitializer
- JVM系统参数
- 环境变量
我的解决方案是将环境变量设置为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