SpringCloud- @ RefreshScope principio y uso

Spring Cloud @RefreshScope principio y uso

https://www.cnblogs.com/javastack/p/12049139.html

RefreshScope (org.springframework.cloud.context.scope.refresh) es una implementación de alcance especial proporcionada por Spring Cloud, que se utiliza para implementar la configuración y la carga en caliente de instancias

 

Singleton y Prototype están codificados de forma rígida, no son subclases de Scope. Scope es en realidad una interfaz extendida personalizada

protected <T> T doGetBean (...) {final RootBeanDefinition mbd = ... if (mbd.isSingleton ()) {...} else if (mbd.isPrototype ()) ...} else {String scopeName = mbd.getScope (); Alcance final alcance = this.scopes.get (scopeName); Objeto scopedInstance = scope.get (beanName, new ObjectFactory <Objeto> () {...}); ...} ...}

La instancia de Scope Bean la crea el propio Scope. Por ejemplo, SessionScope obtiene la instancia de Session, ThreadScope la obtiene de ThreadLocal y RefreshScope la obtiene de la caché integrada.

 

Registro de @ Scope AnnotatedBeanDefinitionReader # registerBean

public void registerBean (...) {

 ...

  ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata (abd);

  abd.setScope (scopeMetadata.getScopeName ());

 ...

  definitionHolder = AnnotationConfigUtils.applyScopedProxyMode (scopeMetadata, definitionHolder, this.registry);

}

 

Proceso de actualización de RefreshScope

La entrada está en ContextRefresher # refresh

refresh () {Map <String, Object> before = ①extract (this.context.getEnvironment (). getPropertySources ()); ②addConfigFilesToEnvironment (); Establecer <String> keys = ④changes (before, ③extract (this.context.getEnvironment (). GetPropertySources ())). KeySet (); this.context.⑤publishEvent (new EnvironmentChangeEvent (claves)); this.scope.⑥refreshAll (); }

①Extraiga todas las variables de parámetros excepto los parámetros estándar (SYSTEM, JNDI, SERVLET)

② Coloque los parámetros en el entorno original en un nuevo contenedor de Spring Context para recargar y cierre el nuevo contenedor después de terminar

③Consulte los parámetros actualizados (excluidos los parámetros estándar)

④ Compara los cambios

⑤Publica eventos de cambio de entorno, recibe: EnvironmentChangeListener / LoggingRebinder

⑥RefreshScope regenera el Bean con nuevos parámetros ambientales. El proceso de regeneración es muy simple. Borre el caché de refresco y destruya el Bean. La próxima vez, se obtendrá una nueva instancia de BeanFactory (la instancia usa la nueva configuración)

 

Supongo que te gusta

Origin blog.csdn.net/lewee0215/article/details/112298651
Recomendado
Clasificación