记录SpringBoot的小知识点

一、在 Spring 上下文刷新之前设置一些自己的环境变量

需求:假设我们自己想根据某些条件设置 系统的启动端口(server.port),或设置一些别的变量时,就可以用如下方法实现。

1、实现 EnvironmentPostProcessor 接口

实现​​Ordered​​是为了启动的顺序。

public class SkyWalkingInstanceNameInit implements EnvironmentPostProcessor, Ordered {
private static final Logger log = LoggerFactory.getLogger(SkyWalkingInstanceNameInit.class);
@Override
public int getOrder() {
return 0;
}
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
log.info("系统环境初始化完成");
Map<String, Object> source = new HashMap<>(4);
source.put("server.port", "9088");
MapPropertySource propertySource = new MapPropertySource("rewriteConfigProperties", source);
// 放到首位,优先级最高
environment.getPropertySources().addFirst(propertySource);
}
}

2、spring.factories 配置文件的配置

​META-INF/spring.factories​​的配置

org.springframework.boot.env.EnvironmentPostProcessor=\
com.huan.study.skywalking.spring.SkyWalkingInstanceNameInit

注意:​ApplicationContextInitializer​​​也是在 应用上下文刷新之前调用,但是​​EnvironmentPostProcessor​​要先执行。

二、多次读取Request中的流数据

1、​​ContentCachingRequestWrapper​​​ 多次读取请求中的数据。
2、​​​ContentCachingResponseWrapper​​ 多次读取响应中的数据。

三、何时启动父上下文,即如何加载bootstrap或application配置文件

1、加载父上下文

由​​BootstrapApplicationListener​​ 完成。

2、加载配置文件

由​​ConfigFileApplicationListener​​ 完成。

从 spring 环境中获取参数值,解析 placeHolder

System.out.println(applicationContext.getEnvironment().getProperty("server.port"));
System.out.println(applicationContext.getEnvironment().resolvePlaceholders("${server.port}"));
System.out.println(applicationContext.getEnvironment().resolvePlaceholders("${server.port1:2233}"));