SpringBoot动态注入Bean
2024-08-30 20:16:28
目的:
在程序运行期间,动态添加Bean进入到Spring容器。
目前使用到的场景:
对当当网的ElasticJob进行封装,通过自定义注解@ElasticJob的方式开启分布式定时任务。
当所有的Bean都初始化完成之后,读取使用了@ElasticJob注解的所有Bean,然后创建SpringJobSchedule实例并添加到Spring容器中,实现任务的启动。
实现方式:
1.新建一个普通的Java类
public class Animal {
private String name;
private String color;
private byte age; public Animal(String name, String color, byte age) {
this.name = name;
this.color = color;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public byte getAge() {
return age;
} public void setAge(byte age) {
this.age = age;
} @Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
", age=" + age +
'}';
}
}
2.通过DefaultListableBeanFactory和BeanDefinitionBuilder实现Bean的动态注入
@SpringBootApplication(scanBasePackages = {"org.example.*"})
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Application.class);
DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory) run.getAutowireCapableBeanFactory();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Animal.class);
beanDefinitionBuilder.addConstructorArgValue("喜鹊").addConstructorArgValue("绿色").addConstructorArgValue();
String beanName = "AnimalAutoName";
//默认单例
beanDefinitionBuilder.setScope("prototype");
autowireCapableBeanFactory.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());
Object bean = run.getBean(beanName);
Animal animal = (Animal) bean;
System.out.println(animal.getAge());
System.out.println(animal.getColor());
System.out.println(animal.getName());
}
}
流程:
在对Bean进行初始化设置时,是通过构造函数进行初始化(要按照构造函数参数顺序进行赋值)还是通过属性进行初始化或者是两者都可以,这完全取决于要动态注入的Bean。
最新文章
- enumerate用法总结-Python 3
- 【leetcode】Valid Sudoku
- leetcode 215. Kth Largest Element in an Array
- Weiphp随笔,百度天气API接口
- Web Project犯错误!
- 网站禁止右键点击js
- GPS模块启动模式说明
- int转多进制
- Angularjs过滤器的开发.
- Connect the Cities(prim)用prim都可能超时,交了20几发卡时过的
- [LeetCode] Dota2 Senate 刀塔二参议院
- 在.NET中使用Redis
- 【linux】linux查找功能
- ReactNative如何在JS中引用原生自定义控件(rn变化太快,网上很多教程有坑,这个我研究后可用,特意分享)
- selenium.common.exceptions.WebDriverException: Message: unknown Error: cannot find Chrome binary
- spring boot 整合dubbo
- golang显示本机IP代码
- DOS磁盘操作类命令
- SEH, SAFESEH相关
- jquery map方法
热门文章
- escape sequence ";\c";
- 常用的rac搭建相关
- Linux 递归批量删除文件夹或文件的命令
- git bash中提示 bash:node: command not found
- h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃
- C++中cin>;>;a原理
- JavaScript学习 Ⅳ
- javascript基础(一): 浏览器控制台使用Element,console,network,source,application
- 数据可视化之PowerQuery篇(十九)PowerBI数据分析实践第三弹 | 趋势分析法
- 一个简单的Maven小案例