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);
}
}
输出如下
来源:https://segmentfault.com/a/1190000015887070
标签:Spring,动态注册,bean
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#设置MDI子窗体只能弹出一个的方法
2022-03-19 23:40:11
![](https://img.aspxhome.com/file/2023/3/98273_0s.png)
Java 实现网络爬虫框架详细代码
2021-12-11 05:15:43
在Spring环境中正确关闭线程池的姿势
2023-11-25 08:07:29
![](https://img.aspxhome.com/file/2023/1/60151_0s.png)
Android开发实现NFC刷卡读取的两种方式
2023-01-14 13:00:07
![](https://img.aspxhome.com/file/2023/4/137914_0s.jpg)
Android模仿知乎的回答详情页的动画效果
2022-12-25 06:08:57
![](https://img.aspxhome.com/file/2023/6/139546_0s.gif)
C语言中队列的结构和函数接口的使用示例
2022-01-08 06:56:40
![](https://img.aspxhome.com/file/2023/0/107400_0s.png)
关于工厂方法模式的Java实现
2021-12-20 18:06:13
Android实现分享长图并且添加全图水印
2021-08-04 19:30:57
java在linux本地执行shell命令的实现方法
2023-11-14 02:31:33
![](https://img.aspxhome.com/file/2023/9/59569_0s.png)
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
![](https://img.aspxhome.com/file/2023/2/122042_0s.png)
C#使用opencv截取旋转矩形区域图像的实现示例
2023-11-12 22:20:44
![](https://img.aspxhome.com/file/2023/2/70412_0s.png)
Android编程使用HTTP协议与TCP协议实现上传文件的方法
2023-11-22 15:37:43
Unity实现单机游戏每日签到系统
2023-05-13 08:42:36
![](https://img.aspxhome.com/file/2023/6/113826_0s.jpg)
Runtime.getRuntime().exec 路径包含空格的解决
2023-05-15 23:54:32
![](https://img.aspxhome.com/file/2023/6/83056_0s.png)
一文详解Java中的Stream的汇总和分组操作
2021-12-24 17:32:54
![](https://img.aspxhome.com/file/2023/3/61313_0s.png)
Java反射机制及Method.invoke详解
2023-11-22 17:25:28