Spring之动态注册bean的实现方法

作者:小灰灰Blog 时间:2023-09-26 14:01:17 

Spring之动态注册bean

什么场景下,需要主动向Spring容器注册bean呢?

如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 DataSource 数据源这个bean了,那么可以怎么玩?

I. 主动注册Bean支持

借助BeanDefinition来实现bean的定义,从最终的使用来看,代码比较少,几行而已


public <T> T registerBean(String name, Class<T> clazz, Object... args) {
  BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
  if (args.length > 0) {
    for (Object arg : args) {
      beanDefinitionBuilder.addConstructorArgValue(arg);
    }
  }
  BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();

BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
  beanFactory.registerBeanDefinition(name, beanDefinition);
  return applicationContext.getBean(name, clazz);
}

测试如下


import com.github.hui.story.quickstory.server.VisitService;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class BeanHolder {
 private final ConfigurableApplicationContext applicationContext;

public BeanHolder(ConfigurableApplicationContext applicationContext) {
   this.applicationContext = applicationContext;
   initSer();
 }

public void initSer() {
   InrSer ser = registerBean("test", InrSer.class);
   ser.name = "一灰";
   ser.uid = 22;
   System.out.println(ser);

InrSer ser2 = registerBean("test2", InrSer.class, "一灰灰Blog", 20);
   System.out.println(ser2);
 }

@ToString
 public static class InrSer {
   private String name;
   private Integer uid;

@Autowired
   private VisitService visitService;

public InrSer() {
   }

public InrSer(String name, Integer uid) {
     this.name = name;
     this.uid = uid;
   }
 }

private <T> T registerBean(String name, Class<T> clazz, Object... args) {
   BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
   if (args.length > 0) {
     for (Object arg : args) {
       beanDefinitionBuilder.addConstructorArgValue(arg);
     }
   }
   BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();

BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
   beanFactory.registerBeanDefinition(name, beanDefinition);
   return applicationContext.getBean(name, clazz);
 }
}

输出如下

Spring之动态注册bean的实现方法

来源:https://segmentfault.com/a/1190000015887070

标签:Spring,动态注册,bean
0
投稿

猜你喜欢

  • C#设置MDI子窗体只能弹出一个的方法

    2022-03-19 23:40:11
  • Java 实现网络爬虫框架详细代码

    2021-12-11 05:15:43
  • 在Spring环境中正确关闭线程池的姿势

    2023-11-25 08:07:29
  • Android开发实现NFC刷卡读取的两种方式

    2023-01-14 13:00:07
  • Android模仿知乎的回答详情页的动画效果

    2022-12-25 06:08:57
  • C语言中队列的结构和函数接口的使用示例

    2022-01-08 06:56:40
  • 关于工厂方法模式的Java实现

    2021-12-20 18:06:13
  • Android实现分享长图并且添加全图水印

    2021-08-04 19:30:57
  • java在linux本地执行shell命令的实现方法

    2023-11-14 02:31:33
  • java实现一次性压缩多个文件到zip中的方法示例

    2021-11-16 07:24:47
  • C#简单聊天室雏形

    2023-02-27 16:14:13
  • java实现把对象数组通过excel方式导出的功能

    2022-07-01 13:20:09
  • Android实现图片缓存与异步加载

    2022-02-25 14:21:06
  • macOS上使用gperftools定位Java内存泄漏问题及解决方案

    2023-03-02 11:42:38
  • C#使用opencv截取旋转矩形区域图像的实现示例

    2023-11-12 22:20:44
  • Android编程使用HTTP协议与TCP协议实现上传文件的方法

    2023-11-22 15:37:43
  • Unity实现单机游戏每日签到系统

    2023-05-13 08:42:36
  • Runtime.getRuntime().exec 路径包含空格的解决

    2023-05-15 23:54:32
  • 一文详解Java中的Stream的汇总和分组操作

    2021-12-24 17:32:54
  • Java反射机制及Method.invoke详解

    2023-11-22 17:25:28
  • asp之家 软件编程 m.aspxhome.com