摘要:原文地址運行時注入與硬編碼注入是相對的。硬編碼注入在編譯時就已經確定了,運行時注入則可能需要一些外部的參數來解決。提供的兩種在運行時求值的方式屬性占位符表達式語言注入外部的值使用注解可以引入文件,使用其中的值。
原文地址:http://blog.gaoyuexiang.cn/Sp...
運行時注入與硬編碼注入是相對的。硬編碼注入在編譯時就已經確定了,運行時注入則可能需要一些外部的參數來解決。
Spring提供的兩種在運行時求值的方式:
屬性占位符(Property placeholder)
Spring表達式語言(SpEL)
注入外部的值使用@PropertySource注解可以引入.properties文件,使用其中的值。
@Configuration @PropertySource("classpath:jdbc.properties") public class JDBCConfig { @Autowired Environment env; @Bean public DataSource dataSource() { env.getProperties("driver"); ... } }深入了解Spring中的Environment
上例的Environment有如下方法獲取屬性
String getProperty(String key);
String getProperty(String key, String defaultValue);
T getProperty(String key, Class
T getProperty(String key, Class
這幾個重載方法的作用顧名思義。其中第一、三個方法獲取一個不存在的屬性時,會拋出IllegalStateException異常。
可以使用containsProperty(String key)方法查看是否存在某個屬性。
其他相關方法:
Class
String[] getActiveProfiles() : 返回激活profile名稱的數組
String[] getDefaultProfiles() : 返回默認profile名稱的數組
boolean acceptsProfiles(String... profiles) : 如果environment支持給定的profile,則返回true
解析屬性占位符使用占位符,可將屬性定義到外部的.properties文件中,然后使用占位符插入到bean中。占位符使用${...}包裝屬性名稱。
在Java配置中使用@Value注解。
public BlankDisc(@Value("${disc.title}") String title, @Value("${disc.artist}") String artist) { this.title = title; this.artist = artist; }
使用占位符必須配置一個PropertySourcesPlaceholderConfigurer bean,它能夠基于Spring Environment及其屬性來解析占位符。
@Bean public PropertySourcesPlaceholderConfigurer placeholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); }使用Spring表達式語言進行裝配
SpEL主要特性:
使用bean的ID來引用bean
訪問對象的屬性和方法
可對值進行算數、關系和邏輯運算
正則表達式匹配
集合操作
SpEL還可以用在DI之外的地方
SpEL樣例SpEL表達式要放在#{ ... }中,里面的"..."就是SpEL表達式。
#{1}
常量,結果始終為1
#{T(System).currentTimeMillis()}
T()表達式會將java.lang.System視為Java中對應的類型,然后調用其方法,獲取當前時間戳。
#{dataSource.user}
dataSource為聲明的其他bean,這里可以獲取它的屬性user
#{systemProperties["username"]}
通過systemProperties對象獲取系統屬性
表示字面量可表示的字面量有int,float/double,String,boolean,其中浮點值可以用科學技術法表示:#{6.18E3}
引用bean、屬性和方法引用對象 | 表達式 |
---|---|
bean | #{dataSource} |
bean"s field | #{dataSource.user} |
bean"s method | #{dataSource.getPassword()} |
bean"s method"s method | #{dataSource.getPassword().toUpperCase()} |
如果方法返回值為null,第四種情況會拋出NullPoniterException。可以使用:
#{dataSource.getPassword()?.toUpperCase()}
其中的?.運算符能夠在訪問前確保不為null,否則返回null。
在表達式中使用類型使用T()表達式來訪問Java類中的static方法和常量,在括號內的是類名,返回一個Class對象,然后調用其方法和常量。
SpEL運算符運算符類型 | 運算符 | |
---|---|---|
算數運算 | +, -, *, /, %, ^ | |
比較運算 | <, >, ==, <=, >=, lt, gt, eq, le, ge | |
邏輯運算 | and, or, not, | |
條件運算 | ?: (ternary), ?: (Elvis) | |
正則表達式 | matches |
Elvis運算符
利用三元運算符來檢查場景:#{disc.title ?: "Rattle and Hum"},當disc.title為null時,返回"Rattle and Hum"。
名稱的來歷據說是因為"?"長得像貓王的頭發。。。
正則表達式
正則表達式利用matches來支持正則匹配。
計算集合引入一個元素 : #{jukebox.songs[4].title}
隨機選取 : #{jukebox.songs[T(Math).random() * jukebox.songs.size()].title}
從String中獲得char : #{"This is a test"[2]}
使用.?[]進行過濾,得到符合條件的子集 : #{jukebox.songs.?[artist eq "Aerosmith"]}
使用.^[]和.$[]進行過濾,得到第一個和最后一個匹配項
使用.![]從集合的每個成員選擇特定屬性放入新集合中 : #{jukebox.songs.![title]}
最后四個表達式有點像lambda表達式
SpEL的表達式可以相互組合使用。
更多Spring學習筆記:https://github.com/kbyyd24/spring.demo.test/issues
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65048.html
摘要:高級裝配條件化的自動裝配與歧義性的作用域表達式語言環境與可以為不同的環境提供不同的數據庫配置加密算法等注解可以在類級別和方法級別,沒有指定的始終都會被創建的方式配置不同環境所需要的數據庫配置會搭建一個嵌入式的數據庫模式定義在測試數據通過加 高級裝配 Spring profile 條件化的bean 自動裝配與歧義性 bean的作用域 Spring表達式語言 環境與profile p...
摘要:關于依賴注入注入的注解提供的注解不僅僅是對象,還有在構造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規定的限制條件。注解是使用限定符的主要方式。 本文首發于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業務對象。在大量Java EE的應用中,隨處可...
摘要:裝配任何一個成功的應用都是由多個為了實現某個業務目標而相互協作的組件構成的創建應用對象之間協作關系的行為通常稱為裝配,這也是依賴注入配置的可選方案在中進行顯示配置在中進行顯示配置隱式的發現機制和自動裝配自動化裝配組件掃描會自動發現應用上下文 裝配Bean 任何一個成功的應用都是由多個為了實現某個業務目標而相互協作的組件構成的 創建應用對象之間協作關系的行為通常稱為裝配(wiring)...
摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...
閱讀 3748·2021-11-24 10:46
閱讀 1710·2021-11-15 11:38
閱讀 3768·2021-11-15 11:37
閱讀 3488·2021-10-27 14:19
閱讀 1946·2021-09-03 10:36
閱讀 1995·2021-08-16 11:02
閱讀 3004·2019-08-30 15:55
閱讀 2258·2019-08-30 15:44