Spring實戰之三:高級裝配

處理自動裝配的歧義性

標示首選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運算符
  • 計算集合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章