EnvironmentPostProcessor接口

    继承该接口,可以在项目启动初期对配置做一些修改,根据最近的一个使用场景做了一个小结;
    1.场景简述如下,在之前的一篇博客中有简单介绍,通过spring.factories来切换注册中心,遇到了一个问题,当使用Eureka作为注册中心的时候,配置中没有填写zookeeper的地址,此时可以正常注册到Eureka,但是zookeeper会循环不断的打印warn日志,我们可以在log4j2.xml文件中设置

<Logger name="org.apache.zookeeper" level="error"/>

来屏蔽这个包下的warn日志,但是这样不灵活,因为开发人员每次去修改不方便,而且提供的是基础jar包,是否可以在提供的jar里面完成这个工作呢?
    2.配置:
    除了在上面说的在配置文件限制指定包的日志级别之外,可不可以做成key-value的配置形式呢?查询资料,可以在bootstrap.properties文件中配置logging.level.com.nero=DEBUG,来限制一个包的日志级别,那么既然是可以通过配置的形式们就可以考虑用实现EnvironmentPostProcessor接口的方法;
    3.代码:
在resources/META-INF/spring.factories里面添加:

org.springframework.boot.env.EnvironmentPostProcessor=com.xxxx.MyEnvironmentPostProcessorZkLog

添加类文件:
@Component
public class MyEnvironmentPostProcessorZkLog implements EnvironmentPostProcessor {

    private static final String ZK_SERVER_KEY = "spring.cloud.zookeeper.connect-string";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {

        String zkConnectString = environment.getProperty(ZK_SERVER_KEY);

        //没有配置时,说明没有使用zk作为注册中心,那么就关闭warn及以下级别的日志,配置了,则不干预
        if (zkConnectString == null ) {
            HashMap<String, Object> map = new HashMap<>(1);
            map.put("logging.level.org.apache.zookeeper", "error");
            PropertySource source = new MapPropertySource("logLevelZk", map);
            environment.getPropertySources().addFirst(source);
        }
    }
}
    代码很清晰简单,先判断是否有spring.cloud.zookeeper.connect-string这项配置,如果有,那么什么都不做,如果没有,那么就关闭warn的日志级别;
    4.小结
    这里是个小案例,其实通过这样的思想,我们可以预处理很多情况,通过一些配置的情况,来添加甚至修改一些配置,比如可以将一些系统的默认配置给修改了,true改为false那样的。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐