开发者学堂课程【 SpringBoot 快速掌握 - 核心技术:ModelScope pretrained model 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9225
@ConfigurationProperties 与 @Value 区别
目录:
一.前言
二.@value 获取值和 @configurationProperties 获取值比较
三.配置文件注入值数据校验
一. 前言
另外一种获取值的方式:
/**
*
*
字面量 /${key} 从环境变量、配置文件中获取值/
#{SpEL”} **/@Value (“${person.last-name}”)Private String lastName;@Value (“#{11*2}”)Private Integer age;@Value(“true”)Private Boolean boss;Private Date birth;Private Mapmaps;Private Listlists;Private Dog dog;
除 @configurationProperties 从配置文件中读取 person 内部所有属性之外,还有另外一个方式。
从前使用的方式是配置方式,例如配 bean 标签时使用。在标签 bean 中,为某一个组件创建对象,写出 person 类型,包括创建时每个属性所述之值,写出 property 标签,用 name 。来指定所赋值的属性名: LastName 。 Value 为指定值。 Value 与 @Value 注解为一致。
同样 @Component 注解的作用也是把 person 加入容器中,标签也是加入其中。而这时 value 赋值则下方就是用 @value 注解来赋值。
Value 可写为字面量,同样可以写 { key }/$ ,其中 { key }}作用为从环境变量,配置文件中获取值。第三种可写为 #/{SpEL} 表达式语言。则 @Value 注解同样支持。
若想获取配置文件中 lastName ,则 @Value (“ ${ Person.Last- name }”)
= 从配置文件中获取。
结论:
Person{ lastName='张三', age=22,boss=true
@vulue 也可。
但与 @ConfigurationProperties 是否存在区别?
@ConfigurationProperties 只需一个注解,批量进行注入。而 @vulue 需要一个一个进行注入。
二.@value 获取值和 @configurationProperties 获取值比较
@value 获取值和 @configurationProperties 获取值比较
|
@ConfigurationProperties |
@Value |
功能 |
批量注入配置文件中的属性 |
一个个指定 |
松散绑定(松散语法) |
支持 |
不支持 |
Spel |
不支持 |
支持 |
JSR303 数据校验 |
支持 |
不支持 |
复杂类型封装 |
支持 |
不支持 |
松散绑定(松散语法):特别是 Last-name 若在此种情况下:
属性名为:
firstName (驼峰命名法); first-name ; first_name;PERSON_FIRST_NAME ;均可。
只有 @ConfigurationProperties 支持此特点。
@vulue 设为 lastName
由于文件类为 last-name ,看是否支持运行?
显示报错服务!获取值出现问题。必须为 last-name 不支持松散绑定!
打开 @ConfigurationProperties ( prefix = "person" ),
进行运行
结果:
Person{lastName=“张三”}
则 @ConfigurationProperties 支持!
@Value 可计算出结果,同样 age 尝试配置。
Person*age=#[11*2]
进行运行,输出结果错误!
原因在于注入值时,需要通过 typeMismatch 转化。
@ConfigurationProperties Validation
–支持JSR303进行配置文件值校验;
从配入文件值时,可进行校验。
使用注解 @Validated
进行校验,
制定规则: @Email(last-name 填成邮箱格式)
在 ConfigurationProperties 下进行运行:
结果报错!错误代码:
Email.person.las-tName,default message
[不是一个合法的电子邮件地址]
说明 @ Email 启动校验。
若换为 @value Value("${person. last-name}")注入值
结果:校验结果无效。{张三依旧取到对应值}
若想知道何时最大不同,则看最大区别:
ConfigurationProperties 与 @value
@ConfigurationProperties ( prcfix = “ person ”)
获取值正常。并可进行校验。此处删除。
此处以如下为例:
@value(“ $(person.maps ”)
结果:报错!最大位于原表格中。
配置文件 yml 还是 properties 均都能获取到值;
只是每一个值的区别由此进行了对比。包括 JSR303 数据校验。
u如果说,只是在某个业务逻辑中需要获取一下配置文件中的某项值使用@Value。
例子:
@RestControllerpublie class HelloController {@Value(""${person.last-name》")private String name; @RequestMapping(" /mayHello")publie String sayHello(o)4return "Hello "name;}}
进行请求访问:
打招呼的人,为某项配置的值,在配置文件中进行获取。
显示结果不正确。
对之前配置页面进行配置完成。如下:
@ value( "s{person.maps}")
再次启动。进行 sayhello 请求。
访问:
如果说,专门编写了一个 javaBean 来和配置文件进行映射﹔(类似于跟数据库内部的记录映射专门写出一个 poor joe ,写出一个 javabean 配置文件中的值),就直接使用 @ConfigurationProperties ;
这就是他们之间的区别。
当然在合适的时候,如果需要用到其他注解,那么就以上两个结合着用,这是他们的区别。
三、配置文件注入值数据校验
@
Component@ConfigurationProperties(prefix = "person" )@Validatedpublic class
Person {*
字面量/${key}从环境变量、配置文件中获取值/#{SpEL]}">*/
//lastName必须是邮箱格式
@Email//@Value("${person.last name}")private String lastName//@Value("#{11*2}")private Integer age;//@Value("true" )private Boolean boss;private Date birth;private Map maps;private List lists;private Dog dog;
这为ConfigurationProperties与@value取值不同。