蓝德网站建设,三水做网站,中国黄页电话号码查询,潍坊专业网站建设最新报价一 背景
springboot 在启动时候会将系统的环境变量、项目的启动时设置的属性 、application.yml文件#xff08;或application.properties文件#xff09;、PropertySource定义的配置文件中的属性加载到Environment对象中#xff0c;分布式配置中心框架也会把配置加载到Env…一 背景
springboot 在启动时候会将系统的环境变量、项目的启动时设置的属性 、application.yml文件或application.properties文件、PropertySource定义的配置文件中的属性加载到Environment对象中分布式配置中心框架也会把配置加载到Environment中。而springboot的属性注入即Value、ConfigurationProperties、xml文件的${.....}就是从Environment拿的数据再进行解析的我们要做的就是对Environment的数据源添加自定义的数据和解析过程中执行我们自定义的解析代码。
二 详细需求 1 根据配置中的内容动态的添加自定义的配置
如配置文件中只配置了一个用户的id启动时根据这个id去获取用户信息并把获取到的信息添加到springboot的配置中也就是定制我们自己获取属性的方式。这样启动后就能直接用到这个id对应的用户姓名、性别等数据不可变的数据可变的数据就涉及到配置动态刷新了后面再讲无需再手动调用接口获取。效果如下
1.1 application.yml文件中配置用户id
user:id: 123
1.2 通过这个用户id “123”来使用这个用户的相关信息
1.2.1 Value Value(${user.123.name})private String user123Name;Value(${user.123.sex})private String user123Age;
1.2.2 ConfigurationProperties
Data
Component
ConfigurationProperties(prefix user.123)
public class UserConfiguration {/*** 姓名*/private String name;/*** 性别*/private String sex;
} Autowiredprivate UserConfiguration userConfiguration;
1.2.3 Environment Autowiredprivate Environment environment;public void configTest() {String user123Age environment.getProperty(user.123.sex);String user123Name environment.getProperty(user.123.name);}
2 自定义属性解析方法
如希望对一个配置文件中的属性执行我们自定义的方法让实际使用这个属性的时候用的是这个方法转换后的属性如我配置了一个加密的属性想通过一个方法解密使得使用时就是明文
spring:redis:password: decode(abc123)
这个decode就是我们自定义的方法方法的入参是一个密文通过这个abc123可以获取到实际的密码。
具体的使用场景如下
1. 在不改变属性名的情况下对已有的配置做一个增强比如上述说的解密或者追加、替换一些字符如整合redis的时候需要的密码不想直接暴漏到项目中因为属性名是肯定不能变的redis根据属性名来找属性的那么就可以自定义一个解密方法来将他的属性值进行解密。
2.将属性值改为之前不存在的属性如上述1.2中动态新增的属性当然可以直接这样用
spring:redis:password: ${user.123.name}
但如果是在执行org.springframework.context.support.PropertySourcesPlaceholderConfigurer#postProcessBeanFactory后添加进去的那么springboot会找不到这个user.123.name属性是会直接报错的ignoreUnresolvablePlaceholders false时默认就是false所以可以自定义一个函数先越过这个校验在后面再进行真正的赋值。
spring:redis:password: getPassword(user.123.name)
不过这个场景比较鸡肋因为只要我们控制好动态新增属性的时机那么就完全可以直接用${...}来替换