當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot_配置-@ConfigurationProperties与@Value区别
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot_配置-@ConfigurationProperties与@Value区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以前配bean標簽的時候,我們要為哪一個組件配置對象,2我寫一個person類型,包括配置的屬性值是多少,<bean class="person"><property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>
</bean>
我寫一個property這個標簽,我們用name屬性來賦值lastName,value就是指定值了,而這一塊的value,和我們的@Value注解是一樣的,@Component注解的作用,也是把Person加入到容器中,bean標簽也是加入到容器中,而這是一個value賦值,而這里是使用@Value注解來賦值,比如我們寫字面量,以前寫字符串數字,布爾值都能寫,包括還能寫,${key},他的作用呢,是從環境變量,或者我們也叫配置文件,獲取值,這是他的第二種寫法,第三種它還支持#{SpEL},Spring的表達式語言,他支持這幾個,那我們@Value里面也是支持這幾個,比如我要獲取配置文件中lastName,//@Value("${person.last-name}")
private String lastName;@Value("#{10*2}")
private Integer age;這是我們Spring的表達式然后還有布爾值,我就那這三個屬性來測一測@Value("true")
private Boolean boss;
package com.learn.bean;import java.util.Date;
import java.util.List;
import java.util.Map;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 將配置文件中配置的每一個屬性的值,映射到這個組件* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中的相關的配置進行綁定* prefix="person":配置文件中哪個下面的所有屬性進行映射* * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;* 默認從全局配置文件中獲取值;*/
//@PropertySource(value= {"classpath:person.properties"})
@Component
//@ConfigurationProperties(prefix="person")
//@Validated
public class Person {/*** <bean class="person">* <property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>* </bean>*/// lastName必須是郵箱格式//@Email@Value("${person.last-name}")private String lastName;@Value("#{10*2}")private Integer age;@Value("true")private Boolean boss;private Date birth;//@Value("${person.maps}")private Map<String,Object> maps;private List<Object> lists;private Dog dog;public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Boolean getBoss() {return boss;}public void setBoss(Boolean boss) {this.boss = boss;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public Map<String, Object> getMaps() {return maps;}public void setMaps(Map<String, Object> maps) {this.maps = maps;}public List<Object> getLists() {return lists;}public void setLists(List<Object> lists) {this.lists = lists;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}@Overridepublic String toString() {return "Person [lastName=" + lastName + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", maps="+ maps + ", lists=" + lists + ", dog=" + dog + "]";}}
package com.learn.springboot;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import com.learn.bean.Person;/*** SpringBoot單元測試** 可以在測試期間很方便的類似編碼一樣進行自動注入等容器的功能*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigurationTests {@AutowiredPerson person;@Testpublic void contextLoads() {System.out.println(person);}}
Person [lastName=張三, age=20, boss=true, birth=null, maps=null, lists=null, dog=null]
22是算出來沒問題,true也沒問題,但是跟ConfigurationProperties,有沒有區別,首先我們ConfigurationProperties只需要一個注解,批量給我們注入,@Value要一個一個來注入,那我們把這些區別都放到這,一個是@ConfigurationProperties,這個注解和@Value,他來獲取值的區別,首先我們在功能上,@ConfigurationProperties(他可以批量注入我們的配置文件中的屬性,我們只需要指定一個properties就行了,@Value需要一個一個指定,@ConfigurationProperties他還支持一個松散綁定,也就是松散語法,這個松散語法的意思就是說,特別是last-name,我們有一個屬性名叫lastName,駝峰命名法的,那你用中間的杠,大小寫不區分,下劃線,都是可以的,這是我們松散綁定
但是只有@ConfigurationProperties能夠支持,如果我們把Value指成lastName@Value("${person.lastName}")由于我們配置文件里面是person.last-name=\u5F20\u4E09我們來看能不能支持,我們發現就啟動報錯了,說我們peron.last-name獲取值有問題,所以我們必須是last-name,他不支持松散語法綁定,而我們這個@ConfigurationProperties呢,他支持,用@ConfigurationProperties獲取值,我們lastName是能獲取到值的,我們這一塊你寫last-name,還是lastName,這都沒問題,人家支持松散語法綁定,這就是我們第二個松散語法綁定,只有@ConfigurationProperties支持
@Value他也有他的好處,他還支持SPEL,Spring的表達式語言,SPEL支持方面,@ConfigurationProperties他就不支持了,而我們的@Value它是支持的,我們在@Value上寫一個東西,我們之前看過,他能幫我們算出來,person.age=#{11*2}我們發現就錯了,錯的原因他說,這是age,你要注入這個值的時候,typeMisMatch,類型轉換異常,所以這一塊他不支持Spring表達式,這是我們的第二個區別
第三個區別呢,@ConfigurationProperties支持JSR303校驗,我們給他里面再擴展一個,JSR303數據校驗,數據校驗@ConfigurationProperties,他能支持,我們@Value他就不支持,我們給配置文件注入值的時候,我們還可以校驗一下,我們可以這樣,用@Validated,我們這個JAVABEAN里面的屬性,要校驗,比如我們加上第一個校驗,我來給一個校驗規則,比如@Email,就是lastName你要填成郵箱格式,lastName必須是郵箱格式,我們是@ConfigurationProperties的情況下,我來運行,這一塊就報錯了,在注入lastName的時候,錯誤代碼email的,他還有錯誤的提示消息,不是一個合法的電子郵件地址,說明他啟動了校驗,但是如果我們換成@Value,讓他來給我們注入值,來看一下這個校驗還能不能生效呢,發現這個校驗是無效的,發現照樣是取到值了,這是他們的這個區別,JSR303是@ConfigurationProperties支持,@Value不支持,我們無論是配置文件,你寫什么都行,不管是yml,還是properties,他們都能獲取到值,只是每一個獲取值的區別,包括JSR303數據校驗的時候,記錄一下數據校驗,配置文件注入值數據校驗,數據校驗必須使用@ConfigurationProperties才可以
到底我們使用哪個比較合適呢,我們再來看一個最大的不同,我們來到@ConfigurationProperties,我們把它注掉,他獲取值一切都是正常的,而且還能做校驗,校驗我也注釋掉,我不要校驗功能了,現在這些值我不以他們為例,我用@Value來獲取Map的值,@Value("${person.maps}")我們看他能不能獲取到,現在用的是@Value注解,我們啟動的時候發現報錯了,就是解析這個map,最大的在這,我們這個@Value注解,在復雜類型封裝,我們這個@ConfigurationProperties,它是能支持的,而我們的@Value它是不能,他只能取出一些基本類型的數據,我們什么時候用@ConfigurationProperties,什么時候用@Value,如果說我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,那就使用@Value,那舉一個例子
除了用@ConfigurationProperties,從person里面讀取所有的屬性,我們還有一種方式,我們有一個注解是@Value,這是我們Spring的一個底層注解,以前我們都是用配置的方式<bean class="person">我寫一個Controller,就叫HelloController,我用@RestController標注上來,他就一個方法,這個hello給誰說呢,我想Hello加上一個人名字,這個人名在配置文件中,我可以給他里面寫一個name,而這個name從配置文件中@Value,來獲取就行了,@Value("${person.last-name}")
private String name;然后就給這個人打招呼,我們來訪問一些這個請求,我們來訪問這個sayHello請求http://localhost:8080/sayHello
package com.learn.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@Value("${person.last-name}")private String name;@ResponseBody@RequestMapping("/sayHello")public String sayHello() {return "Hello" + name;}
}
package com.learn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @SpringBootApplication 來標注一個主程序類,說明這是一個Sprint Boot應用* @author Leon.Sun**/
@SpringBootApplication
public class SpringBoot02ConfigApplication {public static void main(String[] args) {// Spring應用啟動起來SpringApplication.run(SpringBoot02ConfigApplication.class,args);}
}
我們只是從配置文件中獲取一下這個值,就使用@Value,如果說我們專門寫了一個JAVABEAN來和配置文件來進行映射,這就類似于我們和數據庫里的記錄,我們專門來寫一個POJO一樣,一個javaBean來映射配置文件中的值,我們就直接使用@ConfigurationProperties,他就一次性把配置文件中相關的屬性,都注入進來了,那就使用他,這是他們的區別,當然在合適的時候,你如果需要用到其他的注解,那你就兩個結合來用,他們的區別
?
總結
以上是生活随笔為你收集整理的SpringBoot_配置-@ConfigurationProperties与@Value区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot_配置-proper
- 下一篇: SpringBoot_配置-@Prope