Spring Bean 如何重新注入?

故事背景:

以spring cache redis为例,Nacos配置中心配置了cacheManager的ttl参数,以@NacosValue的形式注入并配置为cacheManager的参数。
了解spring cache的朋友们应该明白,这里的cacheManager是spring初始化时初始化的一个Bean,这个Bean在初始化时从Nacos获取了一个ttl参数并配置在这个Bean上。

需求:

修改Nacos的配置,cacheManager自动更新,使得ttl这bean能够刷新。

实现思路:

  1. 通过事件监听机制,监听到Nacos配置变更的动作:实现ApplicationListener接口,实现其方法onApplicationEvent(NacosConfigReceivedEvent event) 。
  2. 在监听接口中解析nacos配置内容。
  3. 从配置内容取出ttl参数。
  4. 通过spring的ApplicationContext取出DefaultListableBeanFactory,使用DefaultListableBeanFactory移除cacheManager这个bean。
  5. 加入新参数ttl,重新生成cacheManager Bean,并放入spring容器中。
    4,5不好描述,参考代码如下:
DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory )ApplicationContextUtil.getContext().getAutowireCapableBeanFactory();
        autowireCapableBeanFactory.removeBeanDefinition(beanName);
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(implBeanClz).getBeanDefinition();
        autowireCapableBeanFactory.registerBeanDefinition(beanName,beanDefinition);