springBoot的EnvironmentPostProcessor使用

springBoot的EnvironmentPostProcessor使用,根据生产环境,加载指定环境所有properties配置文件,并放入自定义工具类PropertiesUtil


前言

在进行公共组件封装时 根据配置的环境,决定采用不同的配置文件,并且将其加载到自定义的PropertiesUtil工具类中

一、EnvironmentPostProcessor是什么?

SpringBoot支持动态的读取文件,留下的扩展接口org.springframework.boot.env.EnvironmentPostProcessor。这个接口是spring包下的,使用这个进行配置文件的集中管理,而不需要每个项目都去配置配置文件。这种方法也是springboot框架留下的一个扩展(可以自己去扩展)

二、使用步骤

1.实现EnvironmentPostProcessor

@Configuration
public class Configs implements EnvironmentPostProcessor, Ordered {

	private static final Integer POST_PROCESSOR_ORDER = Integer.MIN_VALUE+10;

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

    }

    @Override
    public int getOrder() {
        return this.POST_PROCESSOR_ORDER+1;
    }

}

1)首先,要实现springboot提供的EnvironmentPostProcessor接口,并且实现它的postProcessEnvironment方法,postProcessEnvironment就是我们具体写逻辑处理的地方。

2)同时继承spring的Ordered接口来指定优先级,因为springboot是已经有默认的实现了,我们的扩展需要在它们执行之后执行 要不然ConfigurableEnvironment 参数中有些数据是没有的。默认最后一执行的顺序是 Integer.MIN_VALUE+10,我们可以写一个静态 常量。

3)实现Ordered的getOrder方法 并 在前面定义的默认顺序加一this.POST_PROCESSOR_ORDER+1

2.读入数据

主逻辑代码:

 public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        MutablePropertySources propertySources = environment.getPropertySources();
        //这里是获取我们指定的当前激活的配置文件
        String[] profiles = environment.getActiveProfiles();
        Properties prop = getConfig(profiles);
        propertySources.addLast(new PropertiesPropertySource("allProp",prop));
        for (PropertySource<?> propertySource : propertySources) {
            //是键值对的properties 才放入propertiesUtil工具类中
            if(propertySource.getSource() instanceof Map){
                Map map = (Map) propertySource.getSource();
                for (Object key : map.keySet()) {
                    //写入我们定义的工具类缓存中
                    PropertiesUtil.getProperties().put(keyStr, value.toString());
                }
            }
        }

    }

加载配置文件代码getConfig

private Properties getConfig(String[] profiles){
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        List<Resource> resourceList = new ArrayList<>();
        getResource(resolver,resourceList,"classpath*:/*.properties");
        getResource(resolver,resourceList,"classpath*:/log.config");
        if(profiles!=null){
            for (int i = 0; i < profiles.length; i++) {
                String p = "classpath*:/config/"+profiles[i]+"/*.properties";
                getResource(resolver,resourceList,p);
            }
        }
        try {
            //spring properties管理对象  将properties加载处理进ioc
            PropertiesFactoryBean config = new PropertiesFactoryBean();
            config.setLocations(resourceList.toArray(new Resource[]{}));
            config.afterPropertiesSet();
            return config.getObject();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

根据path获取Resource

    private void getResource(PathMatchingResourcePatternResolver resolver,List<Resource> resourceList,String path){
        try {
            Resource[] resources = resolver.getResources(path);
            for (Resource resource : resources) {
                resourceList.add(resource);
            }
        } catch (IOException e) {
            logger.error("",e);
        }
    }

3.配置进spring.factories

在resources 下 META-INF文件夹下加上 spring.factories文件,配置org.springframework.boot.env.EnvironmentPostProcessor
在这里插入图片描述

注意事项

在resources 下 META-INF文件夹下加上 spring.factories文件 并且将类路径配置到org.springframework.boot.env.EnvironmentPostProcessor


总结

EnvironmentPostProcessor 是springboot提供的一个动态使用配置的扩展接口,利用好能够使项目能够在不同的环境使用不同的配置文件。能够整合properties文件通过工具类能够直接获取配置文件中配置的数据。
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
SpringBoot是一个基于Spring框架的开源项目,它可以帮助开发者快速构建基于Spring的应用程序。SpringBoot提供了许多使用示例,下面我们来简单介绍一些常见的SpringBoot使用示例: 1. Web应用程序开发:SpringBoot可以轻松地创建Web应用程序,包括RESTful API服务和基于MVC的网页应用程序。我们可以使用SpringBoot创建一个简单的Hello World Web应用程序,也可以实现用户登录、数据展示等功能。 2. 数据访问:SpringBoot提供了对各种数据访问技术的集成支持,比如JPA、Hibernate、MyBatis等。我们可以利用SpringBoot创建一个使用JPA的数据访问示例,也可以使用MyBatis来实现数据库操作。 3. 消息队列:SpringBoot支持集成各种消息队列技术,比如ActiveMQ、RabbitMQ等。我们可以用SpringBoot创建一个简单的消息队列应用程序,实现消息的发送和接收功能。 4. 定时任务:SpringBoot内置了定时任务的支持,我们可以在SpringBoot应用程序中轻松地创建定时任务,比如定时生成报表、数据备份等。 5. 安全认证:SpringBoot提供了对安全认证技术的集成支持,比如基于Spring Security的用户认证、授权功能。我们可以利用SpringBoot创建一个简单的用户登录认证示例,也可以实现基于角色的访问控制。 总的来说,SpringBoot提供了丰富的使用示例,可以帮助开发者快速了解和掌握SpringBoot的各种功能和特性,从而更高效地开发基于Spring的应用程序。希望以上内容能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值