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容器中
DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory)ApplicationContextUtil.getContext().getAutowireCapableBeanFactory();
autowireCapableBeanFactory.removeBeanDefinition(beanName);
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(implBeanClz).getBeanDefinition();
autowireCapableBeanFactory.registerBeanDefinition(beanName, beanDefinition);
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/how-can-spring-beans-be-reinjected/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论