背景
最近读了一下 spring cloud 的 @RefreshScope
生效的源码,总结一下该注解的 refresh
类型的类实例化的过程。
关键技术点:
- 扫描过程中对
@RefreshScope
注解做了特殊处理,会额外注册两个BeanDefinition
。 GenericScope
实现了BeanDefinitionRegistryPostProcessor
接口,并对 refresh 的BeanDefinition
添加了构造函数参数为自己,同时设置 beanClass 属性为GenericScope.LockedScopedProxyFactoryBean.class
,合成属性为true
。GenericScope.LockedScopedProxyFactoryBean
类实现了FactoryBean
、BeanFactoryAware
、MethodInterceptor
接口。
拆解三个部分:扫描 Bean 定义、代理类实例化、代理类方法调用,从这三个过程的源码,来理解为什么 @RefreshScope
标注的类的实能够动态应对环境变量的变化。
原始扫描 Bean 定义过程
ClassPathBeanDefinitionScanner
扫描时会对 @RefreshScope
注解的类的 BeanDefinition
定义信息作两个操作: