目的:

在程序运行期间,动态添加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。

最新文章

  1. enumerate用法总结-Python 3
  2. 【leetcode】Valid Sudoku
  3. leetcode 215. Kth Largest Element in an Array
  4. Weiphp随笔,百度天气API接口
  5. Web Project犯错误!
  6. 网站禁止右键点击js
  7. GPS模块启动模式说明
  8. int转多进制
  9. Angularjs过滤器的开发.
  10. Connect the Cities(prim)用prim都可能超时,交了20几发卡时过的
  11. [LeetCode] Dota2 Senate 刀塔二参议院
  12. 在.NET中使用Redis
  13. 【linux】linux查找功能
  14. ReactNative如何在JS中引用原生自定义控件(rn变化太快,网上很多教程有坑,这个我研究后可用,特意分享)
  15. selenium.common.exceptions.WebDriverException: Message: unknown Error: cannot find Chrome binary
  16. spring boot 整合dubbo
  17. golang显示本机IP代码
  18. DOS磁盘操作类命令
  19. SEH, SAFESEH相关
  20. jquery map方法

热门文章

  1. escape sequence "\c"
  2. 常用的rac搭建相关
  3. Linux 递归批量删除文件夹或文件的命令
  4. git bash中提示 bash:node: command not found
  5. h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃
  6. C++中cin>>a原理
  7. JavaScript学习 Ⅳ
  8. javascript基础(一): 浏览器控制台使用Element,console,network,source,application
  9. 数据可视化之PowerQuery篇(十九)PowerBI数据分析实践第三弹 | 趋势分析法
  10. 一个简单的Maven小案例