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

我有一个 Spring 项目,它使用另一个项目。每个项目都有自己的 Spring 配置文件,通过 Java 代码对每个配置文件使用 applicationContext.xml*.properties进行初始化。我从 args[]注入了侧写。问题是,第二个项目使用来自 我无法将来自 args[]的 env 注入到第二个项目中,因此我尝试寻找一篇解释 Spring 配置文件如何工作的文章。

  1. 是否有一个层次结构,当 applicationContext.xml没有配置默认值时,它将在其上查看配置文件?
  2. System var 是否比 applicationContext.xml配置更强大?
  3. 你认为什么是我挑战的最佳解决方案?

关于这个主题的文章,甚至例子将是最受欢迎的! ! 先谢谢你。

253598 次浏览

如果您提供您的 JVM Spring 配置文件,应该不会有任何问题:

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

请参阅 Spring-文档:

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

69.5设置活动的 Spring 配置文件

Spring 环境为此提供了一个 API,但通常您需要设置 系统属性(spring.profiles.active)或操作系统环境 例如,用一个 - D 参数(记住把它放在主类或 jar 归档文件之前) :

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

在 SpringBoot 中,您还可以将活动配置文件设置为 属性,例如:。

spring.profiles.active=production

以这种方式设置的值将由 System 属性或环境替换 变量设置,但不是由 SpringApplicationBuilder.profile ()设置的 因此,可以使用后面的 JavaAPI 来扩展概要文件 而不改变默认值。

请参阅第25章“ Spring 引导特性”部分的概要文件 更多信息。

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

application.properties
system properties
environment variable

如果我从我的 webapplication 目录运行命令行: java -Dspring.profiles.active=development -jar yourApplication.jar,它会指出路径是不正确的。因此,我只是在 application.properties 文件中手动定义了这个概要文件,如下所示:

spring.profiles.active=mysql

或者

spring.profiles.active=postgres

或者

spring.profiles.active=mongodb

SprING _ PROFILES _ active 是覆盖/选择 SPRING 配置文件的环境变量

如果您使用 docker 来部署 Spring 启动应用程序,您可以使用标志 你好设置 侧写:

docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t R.test.co/myapp:latest

我通常使用 基于注释的配置而不是 基于 XML 的配置来配置 applicationContext。

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


Getting profile based beans from applicationContext

  • 在豆子上使用@Profile

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

侧写是 dev

Note : if the Profile is given as @Profile("!dev")然后配置文件将排除开发和为所有其他。

  • 在 XML 中使用配置文件属性

<beans profile="dev">
<bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>

设置 profile 的值:

  • 通过 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");
  • Xml 中的上下文参数

    profiles can be activated in the web.xml of the web application as well, using a context parameter:
    <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
  • JVM 系统参数

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

    -Dspring.profiles.active=dev
    

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

Eclipse Run Configuration - screenshot is unavailable

  • 环境变量

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

Any bean that does not specify a profile belongs to “default” profile.


优先顺序是:

  1. Xml 中的 Context 参数
  2. WebApplicationInitializer
  3. JVM 系统参数
  4. Environment variable

您可以通过提供 -Dspring.profiles.active=<env>来设置弹簧配置文件

对于 源(src)目录中的 java 文件,可以使用 System.getProperty("spring.profiles.active")

对于 测试目录中的 java 文件,您可以提供

  • SPRING_PROFILES_ACTIVE呼叫 <env>

或者

因为“环境”、“ jvmArgs”和“ systemProperties”对于“测试”任务被忽略。在 root build.gradle中添加一个任务来设置 jvm 属性和环境变量。

test {
def profile = System.properties["spring.profiles.active"]
systemProperty "spring.profiles.active",profile
environment "SPRING.PROFILES_ACTIVE", profile
println "Running ${project} tests with profile: ${profile}"
}

现在说这个太晚了,但是这里有一些关于这个话题的新趋势: https://howtodoinjava.com/spring-boot2/logging/profile-specific-logging/

这里有一个很好的例子:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="c:/temp/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
  

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d</fileNamePattern>
</rollingPolicy>
</appender>
  

<springProfile name="local | dev">
<logger name="org.springframework" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
 

<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
 

<springProfile name="!local & !dev & !prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
  

</configuration>

! 注意! 如果你有问题使用 &代替它与 &amp;