<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
用過Spring Cloud的同學都知道在使用動態設定重新整理的我們要設定一個 @RefreshScope,在類上才可以實現物件屬性的的動態更新。
@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 { ... }
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*/); ... } }
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使用範例詳解的詳細內容,更多關於RefreshScope設定重新整理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45