運行時值注入
標簽: SpringInActionFourthEdition java spring bean
直接注入
Bean直接注入示例:
@Bean("blankDisc1")
@Profile("dev")
@Primary
public BlankDisc getDevBlankDiscPrimary() {
BlankDisc blankDisc = new BlankDisc();
blankDisc.setTitle("Sgt. Pepper's Lonely Hearts Club Band dev Primary");
List<String> tracks = new ArrayList<>();
tracks.add("Sgt. Pepper's Lonely Hearts Club Band track dev Primary");
blankDisc.setTracks(tracks);
return blankDisc;
}
XML直接注入示例:
<bean id="blankDisc"
class="com.zachary.soundsystem.impl.BlankDisc"
p:title="Sgt. Pepper's Lonely Hearts Club Band"
p:tracks-ref="trackList" />
注入外部的值
創建app.properties文件
disc.title=Sgt. Pepper's Lonely Hearts Club Band
disc.artist=The Beatles
重Environment中獲取外部注入值
@Configuration
@PropertySource("classpath:app.properties")
public class RuntimeInjectCompactDiscConfig {
@Autowired
Environment env;
@Bean
public BlankDisc setBlankDisc() {
BlankDisc blankDisc = new BlankDisc();
blankDisc.setTitle(env.getProperty("disc.title"));
blankDisc.setArtist(env.getProperty("disc.artist"));
blankDisc.setTracks(new ArrayList<>());
return blankDisc;
}
}
Environment中方法:
- String getProperty(String key):返回一個String類型值
- String getProperty(String key, String defaultValue):返回一個String類型值,沒有值時取默認值
- T getProperty(String key, Class type):返回一個指定類型的值
- T getPropety(String key, Class type, T defaultValue):返回一個指定類型的值,沒有時取默認值
- String getRequiredProperty(String key):返回一個String類型的值,沒有定義時拋IllegalStateExceptio異常
- T getRequiredProperty(String key, Class targetType):返回一個指定類型的值,沒有定義時拋IllegalStateExceptio異常
- boolean containsProperty(String key):判斷某個屬性是否存在
- String[] getActiveProfiles():返回**的profile名稱的數組
- String[] getDefaultProfiles():返回默認profile名稱的數組
- boolean acceptsProfiles(Profiles profiles):如果environment支持給定的profile,返回true
小知識:Environment 除了可以注入外,還可以從ConditionContext中獲得。
解析占位符 “&{…}”
為了使用占位符,我們需要配置一個PropertyPlacehokderConfigurer bean或者PropertySourcesPlaceholderConfigurer bean。從Spring3.1開始,推薦使用PropertySourcesPlaceholderConfigrer,因為它是基于Spring Environment及其屬性源解析占位符。
@Bean在Java中配置PropertySourcesPlaceholderConfigrer
示例的代碼:
@Bean
static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
XML配置PropertySourcesPlaceholderConfigrer
context命名空間
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
示例代碼:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder/>
</beans>
Java解析占位符
代碼示例
@Bean
@Qualifier("setBlankDisc2")
public BlankDisc setBlankDisc2(@Value("${disc.title}") String title, @Value("${disc.artist}") String aritst) {
BlankDisc blankDisc = new BlankDisc();
blankDisc.setTitle(title + "setBlankDisc2");
blankDisc.setArtist(aritst + "setBlankDisc2");
blankDisc.setTracks(new ArrayList<>());
return blankDisc;
}
XML解析占位符
代碼示例
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
https://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder/>
<util:list id="trackList">
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
<value>Sgt. Pepper's Lonely Hearts Club Band2</value>
<value>Sgt. Pepper's Lonely Hearts Club Band3</value>
<value>Sgt. Pepper's Lonely Hearts Club Band4</value>
</util:list>
<bean id="blankDisc"
class="com.zachary.soundsystem.impl.BlankDisc"
p:title="${disc.title}"
p:artist="${disc.artist}"
p:tracks-ref="trackList" />
</beans>
java配置類
@Configuration
@PropertySource("classpath:app.properties")
@ImportResource("classpath:cd-config.xml")
public class RuntimeInjectCompactDiscConfig {
@Autowired
Environment env;
}
測試類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=RuntimeInjectCompactDiscConfig.class)
public class RuntimeInjectCompactDiscConfigTest {
@Autowired
BlankDisc blankDisc;
@Test
public void setBlankDiscTest() {
blankDisc.play();
}
}
智能推薦
函數運行時堆棧
每個函數在運行時都要使用運行時堆棧(棧幀),用于存儲局部變量和返回地址,下面我就以簡單的求和函數來分析一下堆棧到底怎樣完成的: 下面為函數的代碼: 簡單解釋一下,ebp和esp是兩個寄存器,分別用來保存這個棧的棧底和棧頂指針 要研究函數的調用過程,就必須對應匯編代碼。...
Android——運行時權限
需要在運行時申請的權限(Android 6.0 以后) 參考:《第二行代碼》 申請 請求應用權限:https://developer.android.google.cn/training/permissions/requesting.html 在AndroidManifest.xml中聲明要申請的權限。 在Activity里判斷。 在onRequestPermissionResult () 中處理...
程序運行時間
這一題其實的算法并不是很難,但是之所以貼到這里來,主要是這里設計幾個基本功的問題。這題有兩個點引起了我的注意。第一個點就是如何對一個數四舍五入。該題中的做法很好 : k = (int)(1.0 * (c2 - c1) / ctk + 0.5) ...
Android 運行時權限
半年前換過手機之后,就發現許多軟件在安裝之后已經授權過的內容,實際使用的過程中,會再次向我詢問權限。這幾天在開發的過程中,也遇到了明明在AndroidManifest.xml文件中申請過權限了,可是程序依舊拋錯,沒有權限的問題。調查以后發現,Android在6.0系統中引用了運行時權限這個功能,從來更好的保護用戶的安全和隱私。 Android將權限歸為兩類,一類是普通權限,一類是特殊權限。對于不會...
淺談Runtime運行時
runtime runtime又叫運行時,是一套底層的c語言api,其為iOS內部核心之一。OC是動態運行時語言,它會將一些工作放在代碼運行時去處理,而非編譯時,比如動態的遍歷屬性和方法,動態的添加屬性和方法,動態的修改屬性和方法等。 了解runtime,首先要先了解它的核心--消息傳遞。 消息傳遞 消息直到運行時才會與方法實踐綁定起來。 一個實例對象調用實例方法,像這樣[obj doSometh...
猜你喜歡
Android運行時權限
Android運行時權限 簡介:Android 6.0 以后,對于一些用戶隱私權限總會在第一次提示用戶是否授予權限。 優點: 更好的保護了用戶的隱私。 給了程序向用戶說明權限的作用。 可以防止一些惡意程序盜取用戶后者手機信息,增強了Android系統的安全性。 Android 6.0 將權限分為兩類: 普通權限:不需要單獨申請,直接在Manifest里注冊即可。 危險權限&危險權限組:危險...
flink運行時架構
flink作為計算引擎,在不同的環境中有著不一樣的運行架構,下面我們簡單說兩種架構,standalone模式和yarn 1.standalone模式 作業管理器(簡稱JM),控制一個流式應用程序的主進程,是一個jvm進程,也就是說,每一個流式處理都會有一個對應的JM 這個流程的感覺就像是一個三口之家,孩子是客戶端,母親是JM,父親是TM。當孩子需要一個東西,他會首先找到他媽媽說,需要這個東西,當他...
Java 運行時異常
Java 運行時異常 Java 的異常分為 檢查型異常(CheckedException) 以及 運行時異常(RuntimeException)。 其中檢查型異常必須被顯式的處理,如果沒有對其進行處理,將無法通過編譯。 目錄 Java 運行時異常 RuntimeException 源碼 繼承類圖 子類 常見的幾個運行時異常 下面我們先看一下 RuntimeException 的源碼 ...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...