欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-23 09:38:46
概述 我们知道,在spring boot中可以通过xml或者@importresource 来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是 prope...

概述

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