• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發其它知識 → Spring高級裝配 不同環境下的軟切換

    Spring高級裝配 不同環境下的軟切換

    相關軟件相關文章發表評論 來源:西西整理時間:2017/10/21 11:19:20字體大?。?em class="fontsize">A-A+

    作者:西西小熊點擊:11次評論:0次標簽: Spring

    Spring appv1.3.2 安卓版
    • 類型:安卓其它大?。?i>6.8M語言:中文 評分:5.0
    • 標簽:
    立即下載

    在一個項目的開發過程中,一般要經過開發、測試、生產等三個階段,分別對應三種環境。因為在各個環境可能數據庫配置、加密算法等的不同,所以將應用從一個環境遷移到另一個環境就變成了一個很大的挑戰。

    Spring在3.1版本中引入bean profile的功能。在使用profile時,可以將不同的bean整理到一個或多個profile中,當應用部署到某個環境時,這個環境對應的profile中的bean就會處于與激活(active)狀態。

    1.配置bean的profile

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

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

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

    2.激活profile

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

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

    如果沒有設置active屬性,Spring會使用default的值。

    如果都沒有設置,Spring只會創建沒有指定Profile的bean。

    可以通過在web.xml設置這個兩個值

     <web-app xxx>

      <!--在上下文中添加默認profile-->

    <context-param>

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

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

    </context-param>

    <servlet>

    ......

      <!--為servlet設置默認profile-->

    <init-param>

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

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

    </init-param>

    </servlet>

    </web-app>

    當Spring啟動時,指定了對應的Profile的bean會被創建,如果一個bean沒有指定profile,則它總會被創建。

    二、條件化的創建bean

    Spring4.x之后,引入@Conditional注解,來實現bean只有滿足某個條件才創建。如果給定條件計算為true,就會創建這個bean。

    @Conditional中需要傳入一個類類型,而這個類需要實現Condition接口;

    Public interface Condition{

      Boolean matches(ConditionContext ctxt,AnnotatedTypeMetadata metadata);

    }

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

      ConditionContext對象可以做如下的事

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

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

      getEnvironment返回的對象可以檢查環境變量是否存在和值是多少

      getResourceLoader返回的對象可以獲取加載的資源

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

    三、處理自動裝配歧義性

    Spring的自動裝配可以給應用開發帶來很大的便利,但是上一章中可以知道,如果在注入時使用接口,變量名也是接口名,且實現該接口的Bean有多個時,注入會出現錯誤。

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

    設置首選Bean

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

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

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

    設置首選Bean是一個非常方便的方式,但是當我們標志了多個首選Bean時,就會無法工作。所以解決歧義問題更強大的方式是限定。

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

      2.限定自動裝配bean

    2.1在添加@Autowired注解實現自動注入時,我們可以再添加一個@Qualifier(“id”)注解,其中傳入我們想注入的bean的id。


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


    2.3當多個Bean有相同的特征詞的時候,依然會出現問題,那么我們就可以自定義限定符注解來實現一個Bean有多個特征詞:

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

        ElementType.METHODElementType.TYPE})

      @Retention(RetentionPolicy.RUNTIME)

      @Qualifier

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

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

    四、Bean的作用域

    Spring應用上下文中生成的Bean默認都是單例形式的,然而在應用中有些類是易變的,會保持一些狀態,因此如果是單例的就會造成問題。

    Spring定義多個作用域,可以基于這些作用域來創建bean:

    單例(Singleton):在應用中只創建一個實例

    原型(Prototype):每次注入或通過Spring應用上下文獲取時創建一個新實例

    會話(Session):在Web應用中,為每個會話創建一個bean

    請求(Request):在Web應用中,為每個請求創建一個bean

    使用:

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

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

    五、配置文件信息注入

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

    Spring提供兩種方式實現,屬性占位符和SpEL表達式

    首先我們需要聲明配置文件的源,在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表達式

    使用SpEl可以將值裝配到bean屬性和構造器參數中。

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

    3.1 SpEL可以獲取bean的引用、屬性和調用方法。

    3.2 SpEL 可以調用類的靜態方法或屬性,如T(java.lang.Math).PI

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

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

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

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)

      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>