概述

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

第一种方式

这外一种方法,相对更简单些,但是相对没那么“优雅”。就是通过EnvironmentPostProcessor接口把我们自定义的propertySource加入environment中,

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
MyPropertySource propertySource = new MyPropertySource("myPropertySource"); Map<String, String> propertyMap = new HashMap<>();
propertyMap.put("myName", "lizo");
propertySource.setProperty(propertyMap);
environment.getPropertySources().addLast(propertySource);
}
}

同时需要在META-INFO/spring.factories中加入

org.springframework.boot.env.EnvironmentPostProcessor=com.lizo.MyEnvironmentPostProcessor

第二种方式

第二种方式可能相对比较复杂一点,其实是参考Sprng 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自定义配置源的更多相关文章

  1. SpringBoot基础系列之自定义配置源使用姿势实例演示

    [SpringBoot基础系列]自定义配置源的使用姿势介绍 前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如 ...

  2. SpringBoot自动配置源码调试

    之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...

  3. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  4. Java之SpringBoot自定义配置与整合Druid

    Java之SpringBoot自定义配置与整合Druid SpringBoot配置文件 优先级 前面SpringBoot基础有提到,关于SpringBoot配置文件可以是properties或者是ya ...

  5. springboot自动配置源码解析

    springboot版本:2.1.6.RELEASE SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfig ...

  6. SpringBoot自定义配置以及IDEA配置提示

    本篇文章将会讲解在springboot项目中如何实现自定义配置以及在IDEA或者Eclipse中实现配置项提示,就像spring的配置提示一样 想要做到这点其实非常简单 1.添加依赖 <depe ...

  7. SpringBoot 自定义配置

    有时候需要自己定义一些配置,比如SpringBoot没有提供Druid连接池的配置,需要我们自己写配置. 以在springboot中使用Druid为例. 依赖 <dependency> & ...

  8. springboot自定义配置信息读取

    在properties配置文件加入自定义配置例如: zxgl.detail.url=http://*****/zxgl-web/news/viewNewsIndexDetail.do?id= #资讯t ...

  9. SpringBoot自定义配置步骤

    1. 在yml中填写自定义配置 ly: sms: accessKeyId: # 短信配置 accessKeySecret: signName: xx商城 # 签名名称 verifyCodeTempla ...

随机推荐

  1. 201521123007《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题目4-1) private static ...

  2. JAVA课程设计--------五子棋

    1.团队课程设计博客链接 http://www.cnblogs.com/mz201521044152/p/7065575.html 2.个人负责模块或任务说明 1.重新开始:写一个restartgam ...

  3. Shiro第五篇【授权过滤、注解、JSP标签方式、与ehcache整合】

    授权过滤器测试 我们的授权过滤器使用的是permissionsAuthorizationFilter来进行拦截.我们可以在application-shiro中配置filter规则 <!--商品查 ...

  4. java进程/线程;堆和栈;多线程

    一.进程和线程 进程:在内存中运行的应用程序,一个exe是一个进程. 如:ps -exf  可以查看各个应用的进程,其中ppid为父进程: ps aux | egrep '(cron|syslog)' ...

  5. 【译】The Accidental DBA:Troubleshooting Performance

    最近重新翻看The Accidental DBA,将Troubleshooting Performance部分稍作整理,方便以后查阅.此篇是Part 2Part 1:The Accidental DB ...

  6. 关于IOS的屏幕适配(iPhone)——资源适配

    IOS的屏幕适配几乎不需要大量的代码操作,更多的时间我们只是动动鼠标选择一下就搞定.可以苹果在这方面做的还是比较人性的,解放了开发者. 首先来说说Iphone这几种屏(由于最近做的是iPhone AP ...

  7. Redis常见的应用场景解析

    Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景. Redis特性 一个产品的使用场 ...

  8. 用sqlserver的自定义函数直接获取多级部门全名

    好久没写存储过程了,今日正好同事的开发需要,实现显示多级部门的部门全名称. 如 财务部/会计部/会计一部   部门表 人员表 函数 getOrgAllName --OrgID 72 当前的部门ID A ...

  9. swift 开发学习问题

    1 UITableViewController 问题: [UITableView dequeueReusableCellWithIdentifier:forIndexPath:], unable to ...

  10. ASP.NET Core 2.0 使用支付宝PC网站支付

    前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的 ...