如何自定义配置源交给springboot管理

     2022-03-24     690

关键词:

概述

我们知道,在Spring boot中可以通过xml或者@ImportResource 来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是 properties(或者 yaml)。那么,如果我们有远程配置,如何把他引入进来来呢。如果有兴趣可以看另外一篇博客,介绍了spring cloud是如何引入远程配置 Spring Cloud 配置服务。当然不看也不影响后面阅读。

如何做

其实自定义配置源只需要3步

第一步,编写PropertySource

编写一个类继承EnumerablePropertySource,然后实现它的抽象方法即可,抽象方法看名字就知道作用,简单起见,这里使用一个map来保存配置,例如:

public class MyPropertySource extends EnumerablePropertySource<Map<String,String>> {

    public MyPropertySource(String name, Map source) {
        super(name, source);
    }

    //获取所有的配置名字
    @Override
    public String[] getPropertyNames() {
        return source.keySet().toArray(new String[source.size()]);
    }

    //根据配置返回对应的属性
    @Override
    public Object getProperty(String name) {
        return source.get(name);
    }
}

第二步,编写PropertySourceLocator

PropertySourceLocator 其实就是用来定位我们前面的PropertySource,需要重写的方法只有一个,就是返回一个PropertySource对象,例如,

public class MyPropertySourceLocator implements PropertySourceLocator {
    @Override
    public PropertySource<?> locate(Environment environment) {
        //简单起见,这里直接创建一个map,你可以在这里写从哪里获取配置信息。
        Map<String,String> properties = new HashMap<>();
        properties.put("myName","lizo");

        MyPropertySource myPropertySource = new MyPropertySource("myPropertySource",properties);
        return myPropertySource;
    }
}

第三步,让PropertySourceLocator生效

新建一个配置类,例如

@Configuration
public class MyConfigBootstrapConfiguration {

    @Bean
    public MyPropertySourceLocator myPropertySourceLocator(){
        return new MyPropertySourceLocator();
    }
}

最后再创建/更新 META-INFO/spring.factories(如果做过自定义Spring boot开发的都知道这个文件)

org.springframework.cloud.bootstrap.BootstrapConfiguration=com.lizo.MyConfigBootstrapConfiguration

简单来说就是给Spring Boot说,这个是一个启动配置类(一种优先级很高的配置类)。

编写测试

测试一

@SpringBootApplication
public class Test2 {

    public static void main(String[] args) throws SQLException {
        ConfigurableApplicationContext run = SpringApplication.run(Test2.class, args);
        Ser bean = run.getBean(Ser.class);
        System.out.println(bean.getMyName());
    }

    @Component
    public static class Ser{
        @Value("${myName}")
        private String myName;

        public String getMyName() {
            return myName;
        }

        public void setMyName(String myName) {
            this.myName = myName;
        }
    }
}

正确输出

测试二

我们在application配置文件中,引入这个变量呢,例如在application.properties中

my.name=${myName}

同样,结果也是能够生效的

myName就是上面在PropertySourceLocator中写进去的配置属性。运行程序,可以看见确实是可以正确输出。

小结

上面只是抛砖引玉,这样无论是哪里的数据源,都可以通过这种方式编写,把配置交给Spring 管理。这样再也不怕在本地配置文件中出现敏感信息啦,再也不怕修改配置文件需要登录每一个机器修改啦。

springboot自定义配置文件数据源

参考技术ASpringBoot支持动态的读取文件,留下的扩展接口org.springframework.boot.env.EnvironmentPostProcessor。这个接口是spring包下的,使用这个进行配置文件的集中管理,而不需要每个项目都去配置配置文件。这种方法也是springboot框架留... 查看详情

如何禁用 TomcatServletWebServerFactory 的 SpringBoot 自动配置以便自定义 spring-starter 提供它?

】如何禁用TomcatServletWebServerFactory的SpringBoot自动配置以便自定义spring-starter提供它?【英文标题】:HowtodisableSpringBootautoconfigurationforTomcatServletWebServerFactoryinorderforacustomspring-startertoprovideit?【发布时间】:2020-03-0807:46:49【问 查看详情

springboot自动装配定义与自定义starter原理,及如何实现自定义装配

前言SpringBoot自动装配定义与自定义starter,基于约定大于配置的原则,实现Spring组件自动装配的目的。 装配的依赖(方式) 模式注解、@Enable模块、条件装配、工厂加载机制。激活自动化装配、实现自动化装配、配置自动... 查看详情

springboot自动装配定义与自定义starter原理,及如何实现自定义装配

前言SpringBoot自动装配定义与自定义starter,基于约定大于配置的原则,实现Spring组件自动装配的目的。 装配的依赖(方式) 模式注解、@Enable模块、条件装配、工厂加载机制。激活自动化装配、实现自动化装配、配置自动... 查看详情

springboot使用嵌入式容器,自定义filter如何配置?

Listener、Filter和Servlet是JavaWeb开发过程中常用的三个组件,其中Filter组件的使用频率最高,经常被用来做简单的权限处理、请求头过滤和防止XSS***等。如果我们使用的是传统的SpringMVC进行开发,那么只需要在Tomcat的web.xml文件中进... 查看详情

如何在 android gradle.kts 中定义自定义源集?

】如何在androidgradle.kts中定义自定义源集?【英文标题】:Howtodefinecustomsourcesetinandroidgradle.kts?【发布时间】:2021-11-1809:57:26【问题描述】:我想在三个商店发布我的应用程序。我的应用程序中有汇率部分和更新对话框(其中有一... 查看详情

springboot实现自定义国际化

...建目录login.properties,login_zh_CN.properties,login_en_US.properties2.SpringBoot自动配置好了管理国际化资源文件的组件;配置前缀spring.messages.basename=i18n.login@Co 查看详情

自定义springbootstarter通过注解启动装配

...论MyConfiguration类是否被spring扫描到都会进行加载1、创建springboot项目2、引入starterjar包3、在启动类添加@EnableSms注解,启用Starter4、配置参数5、调用 查看详情

springboot如何自定义自己的条件注解与自动配置?(代码片段)

SpringBoot的核心功能就是为整合第三方框架提供自动配置,而本文则带着大家实现了自己的自动配置和Starter,一旦真正掌握了本文的内容,就会对SpringBoot产生“一览众山小”的感觉。自定义条件注解在SpringBoot中,... 查看详情

springboot自定义druid数据源,如何注入配置(代码片段)

依赖版本依赖版本如下:<properties><java.version>1.8</java.version><spring-boot.version>2.6.11</spring-boot.version><druid-spring-boot-starter.version>1.2.5</druid-sp 查看详情

在springboot下读取自定义properties配置文件的方法

SpringBoot工程默认读取application.properties配置文件。如果需要自定义properties文件,如何读取呢?一、在resource中新建.properties文件在resource目录下新建一个config文件夹,然后新建一个.properties文件放在该文件夹下。如图remote.properties... 查看详情

springboot自动配置原理源码分析+自定义starter启动器+可视化监控+mybatisplus使用(代码片段)

一、springBoot自动化配置原理1.starter管理机制通过依赖了解SpringBoot管理了哪些starter通过依赖spring-boot-dependencies搜索starter-发现非常多的官方starter,并且已经帮助我们管理好了版本。项目中使用直接引入对应的starter即可,... 查看详情

spring源码-自定义标签-4

  一、自定义标签,自定义标签在使用上面相对来说非常常见了,这个也算是spring对于容器的拓展。通过自定义标签的方式可以创造出很多新的配置方式,并且交给容器直接管理,不需要人工太多的关注。这也是spring对于配置... 查看详情

springboot自定义配置

在springboot中自定义配置项,一下只是其中的一种实现方式application.propertiesalipay.url=https://openapi.alipaydev.com/gateway.doalipay.format=JSONalipay.charset=UTF-8alipay.sign_type=RSA2第一种方式:自定义一个配置属性的实体类1@ConfigurationPr 查看详情

作为管理员,我如何在自定义闪电记录表单中配置字段?

】作为管理员,我如何在自定义闪电记录表单中配置字段?【英文标题】:HowcanIconfigurefieldsinacustomlightningrecordformasanadmin?【发布时间】:2021-10-2310:42:47【问题描述】:我是Salesforce的新手,目前正在尝试为具有特定功能的项目创... 查看详情

springboot的自定义配置

参考技术ASpringBoot免除了项目中大部分的手动配置,对一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.properties文件中,SpringBoot会自动加载全局配置文件,从而... 查看详情

springboot自定义配置

 有时候需要自己定义一些配置,比如SpringBoot没有提供Druid连接池的配置,需要我们自己写配置。 配置文件#指定数据源类型为Druidspring.datasource.type=com.alibaba.druid.pool.DruidDataSource##########druid连接池配置#########spring.datasource.dr... 查看详情

如何自定义一个springbootsrarter

...我们通过学习知道了自动配置原理,其实创建一个自定义SpringBootStarter也很简单。目录​​如何自定义一个SpringBootSrarter?​​​​首先创建一个项目,命名为demo-spring-boot-starter,引入SpringBoot相关依赖​​​​编写配置文件​​... 查看详情