中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Cloud動態配置刷新RefreshScope怎么使用

發布時間:2022-08-29 16:34:32 來源:億速云 閱讀:269 作者:iii 欄目:開發技術

本篇內容介紹了“Spring Cloud動態配置刷新RefreshScope怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

引言

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

@RefreshScope 能實現動態刷新全仰仗著 @Scope這個注解。

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

1、RefreshScope繼承于GenericScope, 而GenericScope實現了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是單例的。(默認)
     *  prototype    表示該bean是多例的,即每次使用該bean時都會新建一個對象。
     *  request        在一次http請求中,一個bean對應一個實例。
     *  session        在一個httpSession中,一個bean對應一個實例
         */
        @AliasFor("value")
        String scopeName() default "";
        /**
    *   DEFAULT			不使用代理。(默認)
        * 	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 的實現原理

1、@RefreshScope的實現

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

可以看出它使用的就是 @Scope,其內部就一個屬性默認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)這個方法幫助我們來創建一個新的bean,也就是說 @RefreshScope在調用刷新的時候會使用get方法來給我們創建新的對象,這樣就可以通過spring的裝配機制將屬性重新注入了,也就實現了所謂的動態刷新。

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

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

三、使用&mdash;&mdash;@RefreshScope 使用流程

1、需要動態刷新的類標注@RefreshScope注解

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

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

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

“Spring Cloud動態配置刷新RefreshScope怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌拉特后旗| 巩义市| 阿巴嘎旗| 湖口县| 桦南县| 兰考县| 阿荣旗| 仁布县| 桃源县| 张北县| 孟津县| 兴义市| 卢龙县| 资溪县| 荔浦县| 聂拉木县| 高青县| 商丘市| 阳山县| 东港市| 新邵县| 保靖县| 嘉鱼县| 英山县| 萨迦县| 科技| 霍城县| 玉溪市| 大英县| 兰溪市| 务川| 柳州市| 西乌珠穆沁旗| 台前县| 保靖县| 甘南县| 天峨县| 天台县| 双流县| 泰州市| 广东省|