首先我們本節(jié)的知識點基于上節(jié)Springboot入門教程系列配置文件的基礎上進行知識點的拓展瑞凑,首先我們進行代碼的改造【Person類】
@Component
public class Person {
@Value("${person.name}")
private String name;
@Value("#{10*2}")
private Integer age;
@Value("false")
private Boolean boos;
@Value("${person.birth}")
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Cat cat;
上述代碼我們利用spring的value注解來進行我們javaBean的屬性的獲取晴及,從上面的代碼中可以看到注解value支持${}【作為占位符來從配置文件中獲取對應屬性值】、以及SPEL表達式【#{}】運算等
同樣利用Springboot的單元格測試來測試一把我們上述的代碼
同樣的我們發(fā)現(xiàn)也可以獲取對應屬性的值奸攻,在這里也體現(xiàn)出了我們ConfigurationProperties和注解Value的明顯之處
- 注解ConfigurationProperties:可以幫助我們將一個javaBean和對應屬性配置進行一一映射和綁定
- 注解Value:如果我們只是想用該javaBean的某些屬性监婶,可以采用注解value的方式
兩者區(qū)別
- 1.ConfigurationProperties支持松散綁定而Value也支持
簡單的代碼改造般哼,將person的name屬性改為lastName如下:
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boos;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Cat cat;
同樣改造我們的配置文件
person:
last-name: 小何
age: 20
birth: 2019/01/01
map: {k1: v1,k2: v2}
list:
- 小黑
- 隔壁老王
cat:
name: 小虎
age: 10
boos: true
測試把敢,首先是ConfigurationProperties的測試
接著我們利用注解Value的方式來獲取屬性,調整我們的代碼如下:
@Component
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{10*2}")
private Integer age;
@Value("false")
private Boolean boos;
@Value("${person.birth}")
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Cat cat;
測試結果如下圖所示:
- 2.ConfigurationProperties不支持SPEL表達式
首先來調整我們的配置文件如下:
person:
last-name: 小王
age: {10*2}
birth: 2019/01/01
map: {k1: v1,k2: v2}
list:
- 小黑
- 隔壁老王
cat:
name: 小虎
age: 10
boos: true
測試結果如下圖所示:
至于注解value是支持的,前面我們已經(jīng)測試過了
-3. ConfigurationProperties支持JSR303數(shù)據(jù)校驗而Value不支持
調整我們的person代碼
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email //表示我們的lastName名字必須是郵件格式的
private String lastName;
@Min(message = "年齡必須大于23",value = 23)
private Integer age;
private Boolean boos;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Cat cat;
在pon文件中添加如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
測試結果如下圖所示:
可以看到的是我們的檢驗起了作用蜈亩,接著我們來看看注解@Value懦窘,修改我們的代碼:
@Component
//@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Value("${person.last-name}")
@Email //表示我們的lastName名字必須是郵件格式的
private String lastName;
@Value("#{10*2}")
@Min(message = "年齡必須大于23",value = 23)
private Integer age;
@Value("false")
private Boolean boos;
@Value("${person.birth}")
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Cat cat;
測試結果如下圖所示:
從上述結果尅看到的是我們的注解Value是不支持JSR303檢驗的
- ConfigurationProperties:支持復雜類型封裝【map等】,value不支持
修改我們的person的代碼
@Component
//@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Value("${person.last-name}")
@Email //表示我們的lastName名字必須是郵件格式的
private String lastName;
@Value("#{10*2}")
@Min(message = "年齡必須大于23",value = 23)
private Integer age;
@Value("false")
private Boolean boos;
@Value("${person.birth}")
private Date birth;
@Value("${person.map}")
private Map<String,Object> map;
private List<Object> list;
private Cat cat;
我們通過注解value來獲取map的數(shù)據(jù)稚配,測試結果如下圖所示:
直接報錯畅涂,這說明了注解Value是不支持的