@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表達式使用率沒有這么高. 所以這里不再進一步討論了.