spring系列-动态注册bean

注册过程

1、注册定时任务,每隔60秒执行一次

@Component
@EnableScheduling
public class CacheTaskVersionMapScan implements SchedulingConfigurer {
   
	@Resource
	private CacheversionTask cacheVersionTask;
	@Resource
	private LogicCalcBeanLoadingTask logicCalcBeanLoadingTask;
	@Resource
	private LogicTaskTrigger logicTaskTrigger;
	@Resource
	private TaskTrigger taskTrigger;
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
   
		taskRegistrar.addTriggerTask(cacheVersionTask,taskTrigger);
		taskRegistrar.addTriggerTask(logicCalcBeanLoadingTask,logicTaskTrigger);
	}
}

public static String getLogicLoadingTaskCron(){
   
	String cronText "0 * * * * ?";
	//通过MCC修改cronText实现动态定时更新
	return cronText;
}

2、扫描DB中的配置信息

QOverride
public void run(){
   
	//是否更新开关
	if(!MccConfigutil.LoadLogicCalcThriftInterface()){
   
		return;
	}
	//从缓存中加载需要处理的Bean而非查询缓存,此步骤可以换成直接查缓存
	List<DynLogicBean>allUsingLogicBeans loadLogicService.getUsingBeans();
	//没有配置任何信息直接跳过
	if(CollectionUtils.isEmpty(allUsingLogicBeans)){
   
		return;
	}

	//得到ApplicationContext中的DefaultListableBeanFactory
	GenericApplicationContext context = (GenericApplicationContext)ApplicationContextServiceUtil.getContext();
	DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)context.getBeanFactory();

	//admin端保证beanname在新建之后不能修改,否则会有很多垃圾bean清理不掉
	for(DynLogicBean dynLogicBean allUsingLogicBeans){
   
		//如果spring中注册过,并且版本spring==db,直接跳过
		//没有跳过的这些配置要么是新增加的要么是更新过的,直接重新注册即可
		defaultListableBeanFactory.registerBeanDefinition(dynLogicBean.getBeanName(), beanDefinitionBuilder.getRawBeanDefinition());
		//原来的做法是卸载:defaultListableBeanFactory.removeBeanDefinition(dynLogicBean.getBeanName());
	}
}

3、如何解析BD

// 通过BeanDefinitionBuilder创建bean定义
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(ThriftClientProxy.class);
beanDefinitionBuilder.setDestroyMethodName("destroy");
// 添加属性
// 添加必须属性
beanDefinitionBuilder.addPropertyValue("serviceInterface", CMigSupplyCalcThriftService.class);
beanDefinitionBuilder.addPropertyValue("timeout", dynLogicBean.getTimeout());
beanDefinitionBuilder.addPropertyValue("serverDynamicWeight", dynLogicBean.getServerDynamicWeight());
beanDefinitionBuilder.addPropertyValue(

相关推荐

  1. spring系列-动态注册bean

    2024-03-31 22:18:06       19 阅读
  2. 如何动态Spring容器注册/移除bean

    2024-03-31 22:18:06       10 阅读
  3. Spring Boot 3】动态注入和移除Bean

    2024-03-31 22:18:06       21 阅读
  4. spring注册bean-AnnotationBeanDefinitionReader】

    2024-03-31 22:18:06       31 阅读
  5. 【应用】Spring-Bean注入-xml+注解

    2024-03-31 22:18:06       15 阅读
  6. Spring Boot Bean 注入详解】

    2024-03-31 22:18:06       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-31 22:18:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-31 22:18:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-31 22:18:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-31 22:18:06       20 阅读

热门阅读

  1. 微微科技遇到的问题总结

    2024-03-31 22:18:06       18 阅读
  2. 设计模式之命令模式 ,Php高级编程

    2024-03-31 22:18:06       16 阅读
  3. 正则表达式

    2024-03-31 22:18:06       17 阅读
  4. Leetcode 232:用栈实现队列

    2024-03-31 22:18:06       17 阅读
  5. leetcode 55.跳跃游戏

    2024-03-31 22:18:06       18 阅读
  6. C#使用Stopwatch类来实现计时功能

    2024-03-31 22:18:06       16 阅读
  7. LEETCODE-DAY38

    2024-03-31 22:18:06       13 阅读
  8. FPGA_mipi

    2024-03-31 22:18:06       14 阅读
  9. 享元模式

    2024-03-31 22:18:06       14 阅读
  10. Rust常用库之处理hex数据hex-literal

    2024-03-31 22:18:06       17 阅读