西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識(shí) → Spring高級(jí)裝配 不同環(huán)境下的軟切換

Spring高級(jí)裝配 不同環(huán)境下的軟切換

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2017/10/21 11:19:20字體大。A-A+

作者:西西小熊點(diǎn)擊:11次評(píng)論:0次標(biāo)簽: Spring

Spring appv1.3.2 安卓版
  • 類型:安卓其它大小:6.8M語言:中文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

在一個(gè)項(xiàng)目的開發(fā)過程中,一般要經(jīng)過開發(fā)、測試、生產(chǎn)等三個(gè)階段,分別對(duì)應(yīng)三種環(huán)境。因?yàn)樵诟鱾(gè)環(huán)境可能數(shù)據(jù)庫配置、加密算法等的不同,所以將應(yīng)用從一個(gè)環(huán)境遷移到另一個(gè)環(huán)境就變成了一個(gè)很大的挑戰(zhàn)。

Spring在3.1版本中引入bean profile的功能。在使用profile時(shí),可以將不同的bean整理到一個(gè)或多個(gè)profile中,當(dāng)應(yīng)用部署到某個(gè)環(huán)境時(shí),這個(gè)環(huán)境對(duì)應(yīng)的profile中的bean就會(huì)處于與激活(active)狀態(tài)。

1.配置bean的profile

在Java中使用@Profile注解指定某個(gè)bean屬于哪個(gè)profile。

如果是JavaConfig配置Spring。我們可以在配置類上添加@Profile,來指定當(dāng)前的配置類中所有的bean的Profile。

如果是XML配置Spring?梢栽<beans>中添加profile=”xx”,來指定標(biāo)簽中的所有<bean>的profile。

2.激活profile

激活Profile需要依賴兩個(gè)屬性spring.profiles.active和spring.profiles.default。

如果設(shè)置了active屬性,Spring會(huì)用此確定哪些profile會(huì)被激活(active可以指定多個(gè))。

如果沒有設(shè)置active屬性,Spring會(huì)使用default的值。

如果都沒有設(shè)置,Spring只會(huì)創(chuàng)建沒有指定Profile的bean。

可以通過在web.xml設(shè)置這個(gè)兩個(gè)值

 <web-app xxx>

  <!--在上下文中添加默認(rèn)profile-->

<context-param>

<param-name>spring.profiles.default</param-name>

<param-name>dev</param-value>

</context-param>

<servlet>

......

  <!--為servlet設(shè)置默認(rèn)profile-->

<init-param>

  <param-name>spring.profiles.default</param-name>

  <param-name>dev</param-value>

</init-param>

</servlet>

</web-app>

當(dāng)Spring啟動(dòng)時(shí),指定了對(duì)應(yīng)的Profile的bean會(huì)被創(chuàng)建,如果一個(gè)bean沒有指定profile,則它總會(huì)被創(chuàng)建。

二、條件化的創(chuàng)建bean

Spring4.x之后,引入@Conditional注解,來實(shí)現(xiàn)bean只有滿足某個(gè)條件才創(chuàng)建。如果給定條件計(jì)算為true,就會(huì)創(chuàng)建這個(gè)bean。

@Conditional中需要傳入一個(gè)類類型,而這個(gè)類需要實(shí)現(xiàn)Condition接口;

Public interface Condition{

  Boolean matches(ConditionContext ctxt,AnnotatedTypeMetadata metadata);

}

此接口只有一個(gè)matches方法,兩個(gè)形參ConditionContext和AnnotatedTypeMetadata。

  ConditionContext對(duì)象可以做如下的事

  getRegistry()返回的對(duì)象可以檢查bean的注冊情況

  getBeanFactory返回的對(duì)象可以檢查bean是否存在,探查bean的屬性

  getEnvironment返回的對(duì)象可以檢查環(huán)境變量是否存在和值是多少

  getResourceLoader返回的對(duì)象可以獲取加載的資源

  AnnotatedTypeMetadata對(duì)象能檢查帶有@Bean注解的方法還有什么其他的注解。

三、處理自動(dòng)裝配歧義性

Spring的自動(dòng)裝配可以給應(yīng)用開發(fā)帶來很大的便利,但是上一章中可以知道,如果在注入時(shí)使用接口,變量名也是接口名,且實(shí)現(xiàn)該接口的Bean有多個(gè)時(shí),注入會(huì)出現(xiàn)錯(cuò)誤。

對(duì)于這種情況,Spring提供兩種方案來解決問題。在可選的多個(gè)Bean中設(shè)置某一個(gè)為首選的bean或者使用限定符來將bean的選擇范圍縮小。

設(shè)置首選Bean

  在JavaConfig中給生成Bean的函數(shù)添加@Primary注解

  在XML中給<bean>中添加 primary=”true”屬性

  在@Component注解后添加@Primary注解

設(shè)置首選Bean是一個(gè)非常方便的方式,但是當(dāng)我們標(biāo)志了多個(gè)首選Bean時(shí),就會(huì)無法工作。所以解決歧義問題更強(qiáng)大的方式是限定。

注:在使用@Primary進(jìn)行設(shè)置首選Bean時(shí),發(fā)現(xiàn)會(huì)出現(xiàn)@Primary檢測不到的情況,我將文件刪除后重新寫發(fā)現(xiàn)又可以檢測到了,不知道是不是IDE緩存的問題,有待考證。

  2.限定自動(dòng)裝配bean

2.1在添加@Autowired注解實(shí)現(xiàn)自動(dòng)注入時(shí),我們可以再添加一個(gè)@Qualifier(“id”)注解,其中傳入我們想注入的bean的id。


2.2在添加@Component注解生成Bean時(shí)添加@Qualifier(“特征詞”)注解,為這個(gè)Bean分配一個(gè)特征詞,這時(shí)就可以在注入時(shí)根據(jù)特征詞來限定裝配。


2.3當(dāng)多個(gè)Bean有相同的特征詞的時(shí)候,依然會(huì)出現(xiàn)問題,那么我們就可以自定義限定符注解來實(shí)現(xiàn)一個(gè)Bean有多個(gè)特征詞:

  @Target({ElementType.CONSTRUCTOR,ElementType.FIELD,

    ElementType.METHODElementType.TYPE})

  @Retention(RetentionPolicy.RUNTIME)

  @Qualifier

  Public  @interface  此處填寫特征詞{}

這時(shí)就可以在生成Bean時(shí)添加多個(gè)特征詞注解,然后在注入時(shí)同時(shí)可以添加多個(gè)注解,直到將范圍縮小到只有一個(gè)bean。

四、Bean的作用域

Spring應(yīng)用上下文中生成的Bean默認(rèn)都是單例形式的,然而在應(yīng)用中有些類是易變的,會(huì)保持一些狀態(tài),因此如果是單例的就會(huì)造成問題。

Spring定義多個(gè)作用域,可以基于這些作用域來創(chuàng)建bean:

單例(Singleton):在應(yīng)用中只創(chuàng)建一個(gè)實(shí)例

原型(Prototype):每次注入或通過Spring應(yīng)用上下文獲取時(shí)創(chuàng)建一個(gè)新實(shí)例

會(huì)話(Session):在Web應(yīng)用中,為每個(gè)會(huì)話創(chuàng)建一個(gè)bean

請求(Request):在Web應(yīng)用中,為每個(gè)請求創(chuàng)建一個(gè)bean

使用:

在JavaConfig中,添加注解@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

在XML中,在<bean>中添加scope=”prototype”屬性

五、配置文件信息注入

在應(yīng)用開發(fā)過程中,我們可能需要使用配置文件來設(shè)置某些值,那么如何通過Spring來將配置文件的值注入到程序中呢?

Spring提供兩種方式實(shí)現(xiàn),屬性占位符和SpEL表達(dá)式

首先我們需要聲明配置文件的源,在JavaConfig中使用注解:

@PropertySource(“classpath:/app.properties”)

  1.通過Environment來檢索屬性

  @Autowired

  Environment env;

  可以通過Environmentget的getProperty()獲取值;

2.通過占位符來檢索屬性

2.1開啟占位符功能

  在spring中如果想使用占位符,需要配置PropertySourcesPlaceholderConfigurer。

  在JavaConfig中,使用如下代碼:

  @Bean

  Public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){

    return new PropertySourcesPlaceholderConfigurer()

  }

如果是使用XML配置,可以使用context命名空間的

<context:property-placeholder>

2.2如何使用占位符?

  如果在XML配置文件中,直接通過${keyname}就可以獲取

  如果在JavaConfig中,可以使用@Value(“$(key)”)注解,類型@Autowired

3.使用SpEL表達(dá)式

使用SpEl可以將值裝配到bean屬性和構(gòu)造器參數(shù)中。

注:SpEL表達(dá)式要放到#{...}中,屬性占位符放到${...}中。

3.1 SpEL可以獲取bean的引用、屬性和調(diào)用方法。

3.2 SpEL 可以調(diào)用類的靜態(tài)方法或?qū)傩,如T(java.lang.Math).PI

3.3 SpEL 可以進(jìn)行計(jì)算,條件判斷,正則匹配(matches)

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)