Nacos源码分析九、配置动态刷新(2)

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

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

首先看一下这个类的类图:

在这里插入图片描述

从这个图上可以看到

  1. FactoryBean。 这是一个工厂bean,也就是说容器中getBean得到的对象是通过它的getObject方法得到的。
  2. BeanFactoryAware。 beanFactory注入,需要关注一下setBeanFactory方法做了什么事情。
  3. 实现了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值