SpringBoot配置中@ConfigurationProperties和@Value的区别
基本特征
@configurationproperties
- 与@bean结合为属性赋值
- 与@propertysource(只能用于properties文件)结合读取指定文件
- 与@validation结合,支持jsr303进行配置文件值的校验,如@notnull@email等
@value
- 为单个属性赋值
- 支持属性上的spel表达式
两者比较
@configurationproperties | @value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
spel | 不支持 | 支持 |
jsr303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
我们用简单的例子来说明一下。
假设在application.properties文件中这样写道:
1 student.name=zhangsan 2 student.age=25 3 student.class=mba 4 student.squad-leader=false 5 student.mail=zhangsan@gmail.com 6 7 student.maps.k1=aaa 8 student.maps.k2=bbb 9 student.maps.k3=ccc 10 11 student.lists=a,b,c 12 13 student.score.english=95 14 student.score.math=90
分别用上面两种绑定属性的方式写两个bean:
studentcp类使用@configurationproperties的方式来绑定属性,相关比较内容可以看代码上面的注释。
1 @component 2 // @propertysource表示加载指定文件 3 // @propertysource(value = {"classpath:student.properties"}) 4 @configurationproperties(prefix = "student") 5 // prefiex表示指定统一前缀,下面就不用再写了 6 @validated // configurationproperties形式下支持jsr303校验 7 public class studentcp { 8 9 private string name; 10 11 private integer age; 12 13 // 支持松散绑定,可以将连接符转成驼峰命名 14 private boolean squadleader; 15 16 // 当前形式下支持jsr303数据校验,表示此属性值必须是email的格式 17 @email 18 private string mail; 19 20 // 支持复杂类型封装对应 21 private map<string, object> maps; 22 23 private list<object> lists; 24 25 private score score; 26 27 }
studentv类使用@value的方式来绑定属性,注释中给出了简单的说明。
1 public class studentv { 2 3 // 使用@value的话只能给属性一一指定映射 4 5 @value("student.name") 6 private string name; 7 8 // @value形式支持spel表达式 9 @value("#{13*2}") 10 // @value("student.age") 11 private integer age; 12 13 // @value("true") // 可直接赋值 14 // 不能支持松散语法的绑定 15 @value("student.squad-leader") 16 private boolean squadleader; 17 18 @value("student.mail") 19 private string mail; 20 21 // 之后的map、list和对象等复杂形式对象@value无法支持 22 23 }
小结
配置文件格式是yml或者properties两者都能够获取值;
如果说只想在某个业务逻辑中获取一下配置文件中的某个值,使用@value;
如果说专门编写一个javabean来和配置文件进行映射,那么就使用@configurationproperties.
其他
@configurationproperties默认从全局配置文件中获取值,如果要从指定配置文件中获取值,那么需要通过@propertysource来声明指定。
@propertysource(value = "classpath:student.properties")
@importresource:导入spring的配置文件,让配置文件里面的内容生效。
我们自定义的配置文件,默认是不能注入(加载)到spring的ioc容器中的,如果想在项目中使用自定义的配置文件,则需要通过@importresource来指定注入才能够最终使用。
@importresource(location = {"classpath:my-beans.xml"})
以前的项目中,我们都在xml中配置bean,但是实际当中(目前),我们不会使用这种方式来给项目添加组件,springboot有推荐的方式,即使用注解。
@configuration标注一个类,指明当前类是一个配置类,就是用来替代之前spring使用xml配置的方式。(<bean id="" class=""></bean>)
1 @configuration 2 public class myconfig { 3 4 /** 5 * 将方法的返回值注入到容器中,容器中这个组件默认的id就是方法名 6 */ 7 @bean 8 public helloservice helloservice() { 9 return new helloservice(); 10 } 11 }
配置文件占位符
可以在***.properties中使用占位符使用一些函数,或者调用之前配置的一些内容:
1 ${ramdom.value} 2 ${random.int(10)} 3 ${student.name} 4 // 获取student.hobit的值,没有的话取冒号后面的缺省值 5 ${student.hobit:football}
上一篇: 患了小儿支气管炎吃什么好得快
下一篇: 山药黄花菜汤怎么做,功效又有哪些
推荐阅读
-
获取@ContextConfiguration注解中的配置文件路径和配置文件中value
-
nginx代理配置 配置中的静态资源配置,root 和 alias的区别。启动注意事项
-
spring boot中关于获取配置文件注解的使用@ConfigurationProperties、@Value、@PropertySource
-
Springboot中关于 static 和 templates的注意事项, 以及webjars的配置
-
Springboot的web开发中static和templates的区别
-
SpringBoot配置中@ConfigurationProperties和@Value的区别
-
springboot @ConfigurationProperties和@PropertySource的区别
-
springboot在配置文件中设置特定功能的启用和停用@ConditionalOnProperty()
-
正斜杠 / 和反斜杠 \ 在路径配置中的区别
-
css属性选择器中[attribute~=value] 和 [attribute*=value]的区别_html/css_WEB-ITnose