前文分析了@RefreshScope注解和RefreshScope类相关内容,我们了解到此时被@RefreshScope注解的类所对应的代理类类型已经换成了LockedScopedProxyFactoryBean,本篇主要分析这个类的作用。
首先看一下这个类的类图:

从这个图上可以看到
- FactoryBean。 这是一个工厂bean,也就是说容器中getBean得到的对象是通过它的getObject方法得到的。
- BeanFactoryAware。 beanFactory注入,需要关注一下setBeanFactory方法做了什么事情。
- 实现了MethodInterceptor接口,也就是说这个是动态代理的一个增强器,需要关注invoke方法。
下面我们具体分析。
getObject
@Override
public Object getObject() {
if (this.proxy == null) {
throw new FactoryBeanNotInitializedException();
}
return this.proxy;
}
这个没啥,获取proxy对象。这是一个cglib生成的动态代理对象。 下面看一下这个对象怎么来的
setBeanFactory
@Override
public void setBeanFactory(BeanFactory beanFactory) {
super.setBeanFactory(beanFactory);
Object proxy = getObject();
if (proxy instanceof Advised) {
Advised advised = (Advised) proxy;
advised.addAdvice(0, this);
}
}
先调用父类方法,里面会生成proxy对象,然后取出来添加了一个增强器是自身。也就是MethodInterceptor。
@Override
public void setBeanFactory(BeanFactory beanFactory) {
if (!(beanFactory instanceof ConfigurableBeanFactory)) {
throw new IllegalStateException("Not running in a ConfigurableBeanFactory: " + beanFactory);
}
ConfigurableBeanFactory cbf = (ConfigurableBeanFactory) beanFactory;
//设置工厂,以便于后面获取代理对象
this.scopedTargetSource.setBeanFactory(beanFactory);
ProxyFactory

本文深入探讨了Nacos中配置动态刷新的工作原理,分析了LockedScopedProxyFactoryBean的作用,它作为FactoryBean创建代理对象,并在setBeanFactory时初始化。通过MethodInterceptor接口实现动态代理,但在refresh作用域下,其invoke方法直接返回,屏蔽其他增强器。同时,RefreshScope监听上下文刷新事件,确保bean在启动阶段实例化。在接收到配置变更时,Nacos会清除缓存bean,以便重新注入新配置。
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=112286978&d=1&t=3&u=1a3a7deceb3a46e4818be8fa1402c655)
8483

被折叠的 条评论
为什么被折叠?



