spring boot 用value读取配置(SpringBoot基础系列Value之字面量及)
spring boot 用value读取配置(SpringBoot基础系列Value之字面量及)当然现实中(至少我有限的代码接触中),纯上面这种写法的不多,更常见的是下面这种@Value("1 2") privateStringcommon; 上面这种初始化之后,common 的值会是 1 2;如果只是这种用法,这个东西就有些鸡肋了,我直接赋值不香嘛,为啥还有这样多此一举呢?<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> II. @Value 知识点上一篇的博文知道通过${}可以获取配置文件中对应的配置值,接下来我们看一
【SpringBoot 基础系列】@Value 之字面量及 SpEL 知识点介绍篇
承接上一篇博文【SpringBoot 基础系列】@Value 中哪些你不知道的知识点 中提及到但没有细说的知识点,这一篇博文将来看一下@Value除了绑定配置文件中的属性配置之外,另外支持的两种姿势
- 字面量表达式支持
- SpEL 语法支持
本项目借助SpringBoot 2.2.1.RELEASE maven 3.5.3 IDEA进行开发
开一个 web 服务用于测试
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
II. @Value 知识点
上一篇的博文知道通过${}可以获取配置文件中对应的配置值,接下来我们看一下另外两种常见的姿势
1. 字面量字面量的使用比较简单,直接在@Value注解中写常量
一个 demo 如下
@Value("1 2")
privateStringcommon;
上面这种初始化之后,common 的值会是 1 2;如果只是这种用法,这个东西就有些鸡肋了,我直接赋值不香嘛,为啥还有这样多此一举呢?
当然现实中(至少我有限的代码接触中),纯上面这种写法的不多,更常见的是下面这种
@Value("demo_${auth.jwt.token}")
privateStringprefixConf;
字面量 配置联合使用,如我们的配置文件值为
auth:
jwt:
token:TOKEN.123
上面的 prefixConf 的取值,实际为 demo_TOKEN.123
2. SpEL 表达式@Value 另外一个很强的使用姿势是支持 SpEL 表达式,至于 SpEL 是什么鬼,推荐查看【SpringBoot 基础系列】SpEL 语法扫盲与查询手册
2.1 基本姿势使用姿势是 #{},表示这个大括弧里面的走 SpEL 表达式,如下
/**
*字符串
*/
@Value("#{'abcd'}")
privateStringspelStr;
/**
*基本计算
*/
@Value("#{1 2}")
privateStringspelVal3;
/**
*列表
*/
@Value("#{{1 2 3}}")
privateList<Integer>spelList;
/**
*map
*/
@Value("#{{a:'123' b:'cde'}}")
privateMapspelMap;
上面是几个基本的 case 了,字面量,表达式,列表/Map 等,SpEL 的基本使用姿势与扫盲博文中的没有什么区别,无外乎就是在外层多了一个${}
当然如果仅仅只是介绍上面几个的话,就有点单调了,SpEL 一个比较强大的就是可以访问 bean 的属性/方法,这就给了我们很多的想像空间了
2.2 调用静态方法:在上面这个配置类com.git.hui.boot.properties.value.config.SpelProperties中添加一个静态方法
publicstaticStringuuid(){
return"spel_" UUID.randomUUID().toString().replaceAll("_" ".");
}
然后我们尝试调用它
/**
*调用静态方法
*/
@Value("#{T(com.git.hui.boot.properties.value.config.SpelProperties).uuid()}")
privateStringspelStaticMethod;
这样spelStaticMethod就会是一个 "spel_" 开头的随机字符串了
请注意:如果在你的实际生产项目中,写出这样的代码,那多半意味着离找下家不远了
2.3 嵌套使用接下来借助 SpEL 与配置绑定的嵌套使用,来稍微调整下上面的实现(实际上下面这种用法也不常见,虽然没问题,但这种代码就属于写时一时爽,维护火葬场了 )
/**
*调用静态方法
*/
@Value("#{T(com.git.hui.boot.properties.value.config.SpelProperties).uuid('${auth.jwt.token}_')}")
privateStringspelStaticMethod;
publicstaticStringuuid(Stringprefix){
returnprefix UUID.randomUUID().toString().replaceAll("_" ".");
}
关于嵌套使用,下面再给出一个基础的使用姿势,供打开思路用
/**
*嵌套使用,从配置中获取值,然后执行SpEL语句
*/
@Value("#{'${auth.jwt.token}'.substring(2)}")
privateStringspelLen;
2.4 Bean 方法调用
最后再来一个访问 bean 的方法的 case
定义一个 Service
@Service
publicclassRandomService{
privateAtomicIntegercnt=newAtomicInteger(1);
publicStringrandUid(){
returncnt.getAndAdd(1) "_" UUID.randomUUID().toString();
}
}
一个使用的姿势如下
/**
*bean方法访问
*/
@Value("#{randomService.randUid()}")
privateStringspelBeanMethod;
3. 测试
最后给出一个注入的结果输出,查看下有没有什么偏离预期的场景
@RestController
@SpringBootApplication
publicclassApplication{
@Autowired
privateSpelPropertiesspelProperties;
@GetMapping("spel")
publicSpelPropertiesshowSpel(){
returnspelProperties;
}
publicstaticvoidmain(String[]args){
SpringApplication.run(Application.class);
}
}
本篇博文主要介绍了@Value除了绑定配置文件中的配置之外,另外两种常见的 case
- 字面量
- SpEL 表达式:定义在#{}里面
借助 SpEL 的强大功能,完全可以发挥我们的脑洞,让@Value修饰的属性初始化不再局限于简单的配置文件,比如从 db redis http 获取完全是可行的嘛,无非就是一个表达式而已
当然这里还存在一个待解决的问题,就是值刷新的支持,已知@Value只在 bean 初始化时执行一次,后续即便配置变更了,亦不会重新更改这个值,这种设计有好有坏,好处很明显,配置的不变性可以省去很多问题;缺点就是不灵活
那么如何让@Value的配置可以动态刷新呢?
咱么下篇博文见,我是一灰灰,欢迎关注长草的公众号一灰灰blog
III. 不能错过的源码和相关知识点0. 项目- 工程:https://github.com/liuyueyi/spring-boot-demo[1]
- 源码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/002-properties-value[2]
配置系列博文
- 【SpringBoot 基础系列】自定义配置源的使用姿势介绍
- SpringBoot基础篇之@Value中哪些你不知道的知识点
- 【SpringBoot 基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情
- 【SpringBoot 基础系列】SpringBoot 配置篇之 PropertySource 加载 Yaml 配置文件实例演示
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
- SpringBoot 基础篇配置信息之配置刷新
- SpringBoot 基础篇配置信息之自定义配置指定与配置内引用
- SpringBoot 基础篇配置信息之多环境配置信息
- SpringBoot 基础篇配置信息之如何读取配置信息
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
- 一灰灰 Blog 个人博客 https://blog.hhui.top[3]
- 一灰灰 Blog-Spring 专题博客 http://spring.hhui.top[4]
一灰灰blog
参考资料[1]https://github.com/liuyueyi/spring-boot-demo: https://github.com/liuyueyi/spring-boot-demo
[2]https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/002-properties-value: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/002-properties-value
[3]https://blog.hhui.top: https://blog.hhui.top
[4]http://spring.hhui.top: http://spring.hhui.top