溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring?Cloud動(dòng)態(tài)配置刷新RefreshScope怎么使用

發(fā)布時(shí)間:2022-08-29 16:34:32 來源:億速云 閱讀:268 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Spring Cloud動(dòng)態(tài)配置刷新RefreshScope怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

引言

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

@RefreshScope 能實(shí)現(xiàn)動(dòng)態(tài)刷新全仰仗著 @Scope這個(gè)注解。

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

1、RefreshScope繼承于GenericScope, 而GenericScope實(shí)現(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時(shí)都會(huì)新建一個(gè)對(duì)象。
     *  request        在一次http請(qǐng)求中,一個(gè)bean對(duì)應(yīng)一個(gè)實(shí)例。
     *  session        在一個(gè)httpSession中,一個(gè)bean對(duì)應(yīng)一個(gè)實(shí)例
         */
        @AliasFor("value")
        String scopeName() default "";
        /**
    *   DEFAULT			不使用代理。(默認(rèn))
        * 	NO				不使用代理,等價(jià)于DEFAULT。
        * 	INTERFACES		使用基于接口的代理(jdk dynamic proxy)。
        * 	TARGET_CLASS	使用基于類的代理(cglib)。
    */
        ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

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

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

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

1、@RefreshScope的實(shí)現(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)部就一個(gè)屬性默認(rèn)ScopedProxyMode.TARGET_CLASS。那我們來看下Scope這個(gè)接口:

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)這個(gè)方法幫助我們來創(chuàng)建一個(gè)新的bean,也就是說 @RefreshScope在調(diào)用刷新的時(shí)候會(huì)使用get方法來給我們創(chuàng)建新的對(duì)象,這樣就可以通過spring的裝配機(jī)制將屬性重新注入了,也就實(shí)現(xiàn)了所謂的動(dòng)態(tài)刷新。

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

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、需要?jiǎng)討B(tài)刷新的類標(biāo)注@RefreshScope注解

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

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

4、在下一次使用對(duì)象的時(shí)候,會(huì)調(diào)用GenericScope get(String name, ObjectFactory<?> objectFactory) 方法創(chuàng)建一個(gè)新的對(duì)象,并存入緩存中,此時(shí)新對(duì)象因?yàn)镾pring 的裝配機(jī)制就是新的屬性了。

“Spring Cloud動(dòng)態(tài)配置刷新RefreshScope怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI