Spring Cloud動(dòng)態(tài)配置刷新RefreshScope使用示例詳解
引言
用過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*/);
...
}
}
三、使用——@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使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于RefreshScope配置刷新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java利用phantomjs進(jìn)行截圖實(shí)例教程
PlantomJs是一個(gè)基于javascript的webkit內(nèi)核無頭瀏覽器 也就是沒有顯示界面的瀏覽器,你可以在基于 webkit 瀏覽器做的事情,它都能做到。下面這篇文章主要給大家介紹了關(guān)于java利用phantomjs進(jìn)行截圖的相關(guān)資料,需要的朋友可以參考下2018-10-10
SpringBoot+STOMP協(xié)議實(shí)現(xiàn)私聊、群聊
本文將結(jié)合實(shí)例代碼,介紹SpringBoot+STOMP協(xié)議實(shí)現(xiàn)私聊、群聊,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
Java二分法查找_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java二分法查找的相關(guān)資料,需要的朋友可以參考下2017-04-04
Mybatis和Mybatis-Plus時(shí)間范圍查詢方式
這篇文章主要介紹了Mybatis和Mybatis-Plus時(shí)間范圍查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
詳解Spring 攔截器流程及多個(gè)攔截器的執(zhí)行順序
這篇文章主要介紹了Spring 攔截器流程及多個(gè)攔截器的執(zhí)行順序的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下2021-05-05

