Spring裝配Bean(七) Spring的執行時注入

z1340954953發表於2018-06-01

Spring中兩種執行時求值的方式

前面在xml中建立bean的時候,使用<construction-arg>注入屬性的值的時候,採用硬編碼,這種方式有時不是很合適,

Spring提供了下面方式實現,執行時注入值

1. 屬性佔位符(Property placeholder)

2. Spring表示式語言(SpEL)

屬性佔位符

*  JavaConfig中使用註解@PropertySource註解和Environment

@Configuration
@PropertySource("classpath:com/bing/config/app.properties")
public class ExpressiveConfig {
	@Autowired
	Environment env;
	@Bean
	public HelloWorld gethelloWorld(){
		return new HelloWorld(env.getProperty("message"));
	}
}

app.properties檔案中

message = hello world!

@PropertySource引用了類路徑中一個名為app.properties的檔案,會將屬性檔案載入到Spring的Environment中,在使用Environment的方法獲取屬性值。

Environment的getProperty()方法:


,另外Environment提供了一些方法檢查profile是否處在啟用狀態


* XML解析屬性佔位符

Spring支援將屬性定義到外部的屬性的檔案中,並且使用佔位符值將其他插入到Spring bean中。在Spring裝配中,佔位符形式${}包裝屬性名稱.資料來源後面再說

<bean id="helloWorld" class="com.erong.service.HelloWorld" scope="session">
   	<property name="message" value="${message}"></property>
   </bean>

如果我們依賴於元件掃描和自動裝配來建立和初始化應用元件的話,不用指定佔位符的配置檔案或類

,這種情況下,使用@Value註解,構造器可以改成如下所示:

@Component
public class HelloWorld {
	private String message;
	public HelloWorld(@Value("${message}") String message){
		this.message = message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String getMessage() {
		return "Your Message: " + message;
	}
}

為了使用佔位符,必須要配置一個PropertySourcesPlaceholderConfigurer,能夠基於SpringEnvironment及其屬性源解析佔位符

JavaConfig中配置這個Bean,注意要寫在配置類中

@Bean
	public PropertySourcesPlaceholderConfigurer getpspc(){
		return new PropertySourcesPlaceholderConfigurer();
	}

XML中配置這個Bean,在location屬性中指定配置檔案的位置

 <!-- 使用佔位符${}必須配置的bean -->
   <context:property-placeholder location="com/bing/config/app.properties"/>
使用Spring表示式語言進行裝配

SpEL特性,包括:

* 使用bean的ID來引用bean;

* 呼叫方法和訪問物件的屬性;

* 對值進行算術、關係和邏輯運算;

* 正規表示式匹配;

* 集合操作

SpEL表示式要放到#{} 之中。

例如:

1. #{T(System).currentTimeMills()}計算結果ms數,T()將java.lang.System視為Java中對應的型別。因而看可以呼叫方法

2. 通過systemProperties物件引用系統屬性 #{systemProperties['disc.title']}

具體看下SpEL的使用

1. 表示字面值  ,表示浮點數、String值以及Boolean值 #{3.21} #{'hello'} #{false}

2. 呼叫Bean的屬性和方法.

#{sgtPeppers.artist} 獲取BeanID為sgtPeppers的bean的artist的屬性

#{artistSelector.selectArtis()?toUppperCase()} ?運算子號,在訪問右邊的內容前,確定是否是null

3. 在表示式中使用型別

需要使用T()運算子 #{T(java.lang.Math)}

* SpEL運算子

算術、比較、邏輯、條件運算子、三元運算子

* SpEL計算集合

[]運算子用來從集合或者陣列中按照索引獲取元素 #{'This is a test'[3]} index基於零開始

總的來說,在Spring裝配Bean時候:

1. Spring佔位符號${} ,適合注入一些常量資料,從配置檔案中讀取資料

2. Spring表示式#{}合適注入一些動態的資料,另一個Bean的資料等等




相關文章