- 點進@RefreshScope可以看到钦勘,其實就是@Scope的value等于refresh,proxyMode等于TARGET_CLASS,所以主要看@Scope的"proxyMode = TARGET_CLASS"
一. @Scope:
- value屬性:
- singleton(默認(rèn)):單例该镣,獲取bean只會有一個實例
- prototype:多例,每次獲取都是新建的實例
- request:每次請求都是一個實例
- session:每個session都是一個實例
- proxyMode屬性:
- DEFAULT响谓、NO:直接返回對象
- INTERFACES:返回代理對象损合,代理對象控制bean的聲明周期,基于JDK代理
- TARGET_CLASS:返回代理對象娘纷,基于CGLib代理
二. 流程:
- spring容器初始化時ConfigurationClassPostProcessor掃描代碼所有spring bean嫁审,并在BeanDefinition里標(biāo)記scope類型
- 獲取bean時,會根據(jù)scope返回對象赖晶,例如單例會有單例池律适,多例直接生成等
- apollo里配置變更時environment里的配置會被修改,TARGET_CLASS類型的bean遏插,在調(diào)用contextRefresher.refresh("beanName")時會清空代理對象的bean緩存捂贿!再次訪問就會新生成一個bean,重新從environment獲取配置實現(xiàn)刷新