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)