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