SpringBoot 使用SpringEL表達式


@Value

此注解, 我們用的最多的是讀取配置文件屬性的:

@Value("${database.dirverName}")
String driverName;

這里的@Value中的${...}代表占位符, 它會讀取上下文的屬性值裝配到屬性中, 這就是一個最簡單的SpringEL表達式, 通過SpringEL可以擁有更強大的運算規則來更好的裝配Bean.

它能夠調用方法, 例如, 我們記錄一個Bean的初始化時間:

@Value("#{T(System).currentTimeMillis()}")
private Long initTime = null;

注意, 這里采用的#{...}代表啟用SpringEL表達式, 它將具有運算功能, T(...)代表的是引入類, System是java.lang.*包的類, 這是java默認加載的包, 因此可以省略不寫全限定類名, 如果是其他包, 需要寫出全限定類名才能引用類. currentTimeMillis是它的靜態方法, 也就是調用了一次System.currentTimeMillis()方法來為這個屬性賦值.

此外還可以直接為屬性賦值, 如下:

// 賦值字符串
@Value("#{'使用SpringEL賦值字符串'}")
private String str = null;

// 科學計數法賦值
@Value("#{9.3E3}")
private double d;

// 賦值浮點數
@Value("#{3.14}")
private float pi;

雖然這比較靈活, 但有時候我們還可能去獲取其他Spring Bean的屬性來給當前的Bean屬性賦值, 例如:

@Value("#{beanName.str}")
private String otherBeanProp = null;

注意, 這里的beanName是Spring Ioc容器中某個Bean的名稱, str是Bean的屬性, 代表引用對應的Bean的屬性str賦值給當前屬性.有時候, 我們還希望這個屬性的字母賦值時候全部變為大寫, 這時候就可以寫成:

@Value("#{beanName.str?.toUpperCase()}")
private String otherBeanProp = null;

再次注意這里的EL表達式, 這里引用的str后面跟着一個 ? , 這個符號?的含義是判斷這個屬性是否為空, 如果不為空才去執行后面的方法toUpperCase方法, 進而把屬性變為大寫, 賦值給當前屬性.除此之外, 還可以使用SpringEL進行一定的運算, 如下:

// 數學運算
@Value("#{1+2}")
private int run;

// 浮點數比較運算
@Value("#{beanName.pi==3.14f}")
private bolean piFlag;

// 字符串比較
@Value("#{beanName.str eq 'Spring Boot'}")
private boolean strFlag;

// 字符換連接
@Value("#{beanName.str + ' 連接字符串'}")
private String strApp = null;

// 三目運算
@Value("#{beanName.d > 1000 ? '大於' : '小於'}")
private String resultDesc = null;

SpringEL能夠支持的運算還有很多, 其中等值比較如果是數字的可以使用==比較, 如果是字符串的可以使用 eq 進行比較, 當然, EL的內容遠遠不止這些, 只是其他的EL表達式使用率沒有這么高. 所以這里不再進一步討論了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM