最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解

 更新時間:2022年08月29日 10:48:22   作者:刨紅薯的小羊竿爾  
這篇文章主要為大家介紹了Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

用過Spring Cloud的同學(xué)都知道在使用動態(tài)配置刷新的我們要配置一個 @RefreshScope,在類上才可以實現(xiàn)對象屬性的的動態(tài)更新。

@RefreshScope 能實現(xiàn)動態(tài)刷新全仰仗著 @Scope這個注解。

一、了解@RefreshScope,先要了解@Scope

1、RefreshScope繼承于GenericScope, 而GenericScope實現(xiàn)了Scope接口。

2、@Scope代表了Bean的作用域,我們來看下其中的屬性:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
        /**
         * Alias for {@link #scopeName}.
         * @see #scopeName
         */
        @AliasFor("scopeName")
        String value() default "";
        /**
         *  singleton  表示該bean是單例的。(默認(rèn))
     *  prototype    表示該bean是多例的,即每次使用該bean時都會新建一個對象。
     *  request        在一次http請求中,一個bean對應(yīng)一個實例。
     *  session        在一個httpSession中,一個bean對應(yīng)一個實例
         */
        @AliasFor("value")
        String scopeName() default "";
        /**
    *   DEFAULT			不使用代理。(默認(rèn))
        * 	NO				不使用代理,等價于DEFAULT。
        * 	INTERFACES		使用基于接口的代理(jdk dynamic proxy)。
        * 	TARGET_CLASS	使用基于類的代理(cglib)。
    */
        ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

3、@RefreshScope等同于scopeName="refresh"的@Scope:

 @Scope("refresh")
 public @interface RefreshScope {
     ...
 }

二、RefreshScope 的實現(xiàn)原理

1、@RefreshScope的實現(xiàn)

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Scope("refresh")
@Documented
public @interface RefreshScope {
        /**
         * @see Scope#proxyMode()
         */
        ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}

可以看出它使用的就是 @Scope,其內(nèi)部就一個屬性默認(rèn)ScopedProxyMode.TARGET_CLASS。那我們來看下Scope這個接口:

public interface Scope {
        Object get(String name, ObjectFactory<?> objectFactory);
        @Nullable
        Object remove(String name);
        void registerDestructionCallback(String name, Runnable callback);
        @Nullable
        Object resolveContextualObject(String key);
        @Nullable
        String getConversationId();
}

主要看看Object get(String name, ObjectFactory<?> objectFactory)這個方法幫助我們來創(chuàng)建一個新的bean,也就是說 @RefreshScope在調(diào)用刷新的時候會使用get方法來給我們創(chuàng)建新的對象,這樣就可以通過spring的裝配機制將屬性重新注入了,也就實現(xiàn)了所謂的動態(tài)刷新。

2、GenericScope幫我們實現(xiàn)了Scope最重要的 get(String name, ObjectFactory<?> objectFactory) 方法,在GenericScope 里面 包裝了一個內(nèi)部類 BeanLifecycleWrapperCache 來對加了 @RefreshScope 從而創(chuàng)建的對象進行緩存,使其在不刷新時獲取的都是同一個對象。

public class GenericScope implements Scope, BeanFactoryPostProcessor...{
      @Override
      public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
          throws BeansException {
          beanFactory.registerScope(this.name/*refresh*/, this/*RefreshScope*/);
          ...
      }
}

三、使用——@RefreshScope 使用流程

1、需要動態(tài)刷新的類標(biāo)注@RefreshScope注解

2、@RefreshScope 注解標(biāo)注了@Scope 注解,并默認(rèn)了ScopedProxyMode.TARGET_CLASS; 屬性,此屬性的功能就是在創(chuàng)建一個代理,在每次調(diào)用的時候都用它來調(diào)用GenericScope get 方法來獲取對象

3、如屬性發(fā)生變更會調(diào)用 ContextRefresher refresh() -》RefreshScope refreshAll() 進行緩存清理方法調(diào)用,并發(fā)送刷新事件通知 -》 GenericScope 真正的 清理方法destroy() 實現(xiàn)清理緩存

4、在下一次使用對象的時候,會調(diào)用GenericScope get(String name, ObjectFactory<?> objectFactory) 方法創(chuàng)建一個新的對象,并存入緩存中,此時新對象因為Spring 的裝配機制就是新的屬性了。

以上就是Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于RefreshScope配置刷新的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java序列化(Serialization) 機制

    Java序列化(Serialization) 機制

    本篇文章是對Java中對象的序列化(Serialization) 機制進行了詳細(xì)的分析介紹,并附實例,需要的朋友可以參考下
    2016-07-07
  • java利用phantomjs進行截圖實例教程

    java利用phantomjs進行截圖實例教程

    PlantomJs是一個基于javascript的webkit內(nèi)核無頭瀏覽器 也就是沒有顯示界面的瀏覽器,你可以在基于 webkit 瀏覽器做的事情,它都能做到。下面這篇文章主要給大家介紹了關(guān)于java利用phantomjs進行截圖的相關(guān)資料,需要的朋友可以參考下
    2018-10-10
  • Spring容器中已經(jīng)存在的Bean替換示例

    Spring容器中已經(jīng)存在的Bean替換示例

    這篇文章主要為大家介紹了Spring容器中已經(jīng)存在的Bean替換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • SpringBoot+STOMP協(xié)議實現(xiàn)私聊、群聊

    SpringBoot+STOMP協(xié)議實現(xiàn)私聊、群聊

    本文將結(jié)合實例代碼,介紹SpringBoot+STOMP協(xié)議實現(xiàn)私聊、群聊,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • java 如何判斷是否可以ping通某個地址

    java 如何判斷是否可以ping通某個地址

    這篇文章主要介紹了java 如何判斷是否可以ping通某個地址,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java二分法查找_動力節(jié)點Java學(xué)院整理

    Java二分法查找_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Java二分法查找的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 利用Java編寫一個Java虛擬機

    利用Java編寫一個Java虛擬機

    這篇文章主要為大家詳細(xì)介紹了如何使用 Java17 編寫的 Java 虛擬機,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解下
    2023-07-07
  • Mybatis和Mybatis-Plus時間范圍查詢方式

    Mybatis和Mybatis-Plus時間范圍查詢方式

    這篇文章主要介紹了Mybatis和Mybatis-Plus時間范圍查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 解決JTable排序問題的方法詳解

    解決JTable排序問題的方法詳解

    本篇文章是對JTable排序問題的方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解Spring 攔截器流程及多個攔截器的執(zhí)行順序

    詳解Spring 攔截器流程及多個攔截器的執(zhí)行順序

    這篇文章主要介紹了Spring 攔截器流程及多個攔截器的執(zhí)行順序的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下
    2021-05-05

最新評論

安国市| 靖宇县| 宣恩县| 同仁县| 普兰店市| 荣昌县| 綦江县| 巧家县| 武隆县| 望谟县| 永顺县| 宜黄县| 珲春市| 城步| 黄陵县| 资兴市| 梅河口市| 巩留县| 萨嘎县| 沂源县| 章丘市| 淮南市| 甘肃省| 沾化县| 台北县| 峨眉山市| 开化县| 砚山县| 长丰县| 贵州省| 灵丘县| 武陟县| 邢台市| 金沙县| 应用必备| 惠来县| 丰都县| 张家川| 白山市| 巨野县| 广安市|