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}"));
posted @ 2020-07-19 14:11  huan1993  阅读(47)  评论(0编辑  收藏  举报