處理自動裝配的歧義性
標示首選bean
@Primary和@Component組合使用,聲明該bean在自動掃描時爲首選bean,在遇到歧義時首先使用首選bean
限定自動裝配的bean
@Autowired(@Inject)和@Qualifier配合使用,在注入時指定要注入進去的是哪個bean,如@Qualifier(“iceCream”),表明注入ID(確切地講是限定符,只不過默認限定符和ID是相同的 )爲iceCream的bean
創建自定義限定符
@Qualifier和bean聲明(@Component或@Bean)一起使用時顯示指定該bean的限定符
bean的作用域
在Spring中,bean默認都是單例的,但其實一共有以下幾種作用域:
- Singleton:整個應用範圍只創建bean的一個實例
- Prototype:每次注入或通過應用上下文獲取的時候,都會創建一個新的bean的實例
- Session:在Web應用中,爲每個會話創建一個bean實例
- Request:在Web應用中,爲每個請求創建一個bean實例
通過@Scope和@Bean(或@Component)一起使用來指定bean的作用域。
代理模式
使用會話和請求作用域時,@Scope還有一個proxyMode屬性,如下所示:
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)
proxyMode指定使用接口的方式實現該bean的代理,如果proxyMode的值設置爲:ScopedProxyMode.TARGET_CLASS
則表明要使用CGLib來生成基於類的代理。
如果是使用xml的配置方式,要指定使用CGLib的基於類的代理需加上以下元素:
<aop:scoped-proxy/>
如果不使用該元素,默認就是使用基於接口的代理,也可以使用下面方式來顯示指定接口方式的代理:
<aop:scoped-proxy proxy-target-class="false"/>
運行時值注入
注入外部的值
使用以下方式可以將文件中的鍵值對加載到Environment中,然後就可以在Environment中取這些屬性。
@Configuration
@PropertySource("classpath:/com/pingan/config.properties")
public class CDPlayerConfig {}
我們還可以將屬性定義到外部的屬性文件中,並使用佔位符值將其插入到Spring bean中。在裝配時佔位符的形式爲”${…}”,這些屬性是在配置文件以外的一個源得到的,可以在xml和註解中使用。使用註解方式時,需要配置一個PropertySourcesPlaceholderConfigurer的bean,如下所示:
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
如果使用xml的配置方式,要使用佔位符需要加入以下元素:
<context:property-placeholder/>
我們還可以使用Spring表達式語言(SpEL)來注入屬性,SpEL表達式放到#{},使用SpEL表達式的值可以是:
- 調用方法
- 字面量
- 引用其他bean的屬性和方法
- 訪問類的靜態方法和常量:要依賴T()
- 使用運算符計算表達式結果
- 計算正則表達式:matches運算符
- 計算集合