spring boot自定义配置源操作步骤

概述

我们知道,在Spring boot中可以通过xml或者@ImportResource 来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是 properties(或者 yaml)。那么,如果我们有远程配置,如何把他引入进来来呢。

如何做

其实自定义配置源只需要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 管理。这样再也不怕在本地配置文件中出现敏感信息啦,再也不怕修改配置文件需要登录每一个机器修改啦。

(0)

相关推荐

  • spring boot自定义配置源操作步骤

    概述 我们知道,在Spring boot中可以通过xml或者@ImportResource 来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是 properties(或者 yaml).那么,如果我们有远程配置,如何把他引入进来来呢. 如何做 其实自定义配置源只需要3步 第一步,编写PropertySource 编写一个类继承EnumerablePropertySource,然后实现它的抽象方法即可,抽象方法看名字就知道作用,简单起见,这里使用一个map来保存配置,例如: publ

  • Spring Boot自定义配置实现IDE自动提示功能

    一.背景 官方提供的spring boot starter的配置项,我们用IDE配置的时候一般都有自动提示的,如下图所示 而我们自己自定义的配置却没有,对开发非常不友好容易打错配置, 那这个是怎样实现的呢? 二.提示原理 IDE是通过读取配置信息的元数据而实现自动提示的,而元数据在目录 META-INF 中的 spring-configuration-metadata.json 或者 additional-spring-configuration-metadata.json 三.实现自动提示 以

  • Spring Boot自定义配置属性源(PropertySource)

    配置覆盖优于profile 在生产实践中,配置覆盖是解决不同环境不同配置的常用方法.比如用生产服务器上的配置文件覆盖包内的文件,或者使用中心化的配置服务来覆盖默认的业务配置. 相比于profile机制(比如maven的profile.spring boot的profile-specific properties),即不同环境使用不同的配置文件,覆盖的方式更有优势.程序员在开发时不需要关心生产环境数据库的地址.账号等信息,一次构建即可在不同环境中运行,而profile机制需要将生产环境的配置写到项

  • spring boot 自定义starter的实现教程

    spring boot 使用 starter 解决了很多配置问题, 但是, 他是怎么来解决这些问题的呢? 这里通过一个简单的例子, 来看一下, starter是怎么来设置默认配置的. 一. 建 starter 项目 自定义的starter, 项目命名规范是: 自定义名-spring-boot-starter 先来看一下, 我最后的目录结构 1. 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns

  • Spring Boot事务配置操作

    1.在启动主类添加注解:@EnableTransactionManagement 来启用注解式事务管理,相当于之前在xml中配置的<tx:annotation-driven />注解驱动. 2.在需要事务的类或者方法上面添加@Transactional() 注解,里面可以配置需要的粒度: 这么多东西提供配置: Isolation :隔离级别 隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取.重复读.幻读. 我们可以看 org.springframework.

  • 使用Spring Boot Mybatis 搞反向工程的步骤

    1. 拷贝 Mybatis 反向工程配置文件到项目的根目录下 2. 根据项目及表的情况,修改 GeneratorMapper.xml 配置 如果使用 高版本 , 驱动类变为:com.mysql.cj.jdbc.Driver url 后面应该加属性 nullCatalogMeansCurrent=true ,否则生成有问题 当前版本 MySQL 数据库为 5.7 主要根据注释来修改自己的内容 <?xml version="1.0" encoding="UTF-8"

  • spring boot自定义log4j2日志文件的实例讲解

    背景:因为从 spring boot 1.4开始的版本就要用log4j2 了,支持的格式有json和xml两种格式,此次实践主要使用的是xml的格式定义日志说明. spring boot 1.5.8.RELEASE 引入log4j2的开发步骤如下: 1.首先把spring-boot-starter-web以及spring-boot-starter包下面的spring-boot-starter-logging排除,然后引入spring-boot-starter-log4j2包. <dependen

  • 浅谈Spring Boot 属性配置和自定义属性配置

    在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配置足以满足正常的功能开发. 如果需要修改自定义修改默认配置,spring boot 提供了很简便的方法,只需要在application.properties 中添加修改相应的配置.(spring boot启动的时候会读取application.properties这份默认配置) 一.修改默认配置 例

  • Spring Boot Security配置教程

    1.简介 在本文中,我们将了解Spring Boot对spring Security的支持. 简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它. 2.默认Security设置 为了增加Spring Boot应用程序的安全性,我们需要添加安全启动器依赖项: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • spring boot学习笔记之操作ActiveMQ指南

    目录 前言 ActiveMQ 介绍 队列(Queue) 广播(Topic) 同时支持队列(Queue)和广播(Topic) 总结 前言 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题,实现高性能.高可用.可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件. 目前在生产环境中使用较多的消息队列有 ActiveMQ.RabbitMQ.ZeroMQ.Kafka.MetaMQ.RocketMQ 等. 特性 异步性:将耗时的同步操作通过以发送消息的方式进行了异步化

随机推荐