目的:

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

SpringBoot动态注入Bean的更多相关文章

  1. springBoot 动态注入bean(bean的注入时机)

    springBoot 动态注入bean(bean的注入时机) 参考博客:https://blog.csdn.net/xcy1193068639/article/details/81517456

  2. 基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中

    基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中 一.背景 二.实现方案 1.基于@ComponentScan注解实现 2.基 ...

  3. Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  4. spring boot 动态注入bean

    方法一 SpringContextUtil public class SpringContextUtil { private static ApplicationContext application ...

  5. Spring中如何动态注入Bean实例教程

    前言 在Spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,容易出现未被正确注入成功的情况. 本文将介绍一种在实际项目中基于动态的方式来提取Spring管理的Be ...

  6. springboot 静态方法注入bean、使用@value给static变量赋值

    首先新建你的方法类:DemoUtil 头部加注解:@Component @Component public class DemoUtil { } 新增静态变量: static DemoService ...

  7. Spring 梳理-运行时动态注入bean

    动态注入的方法 使用占位符 使用Spring表达式

  8. Spring Boot动态注入删除bean

    Spring Boot动态注入删除bean 概述 因为如果采用配置文件或者注解,我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bean,包括:动态注入,动态删除. 动态注入 ...

  9. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

随机推荐

  1. Oracle Solaris 10下gdb安装(附安装包)

    文章目录 1. 背景说明 2. gdb相关包 3. gdb安装 3.1 上传资源 3.2 解压 3.3 安装 3.4 环境变量 4. 位数确认 5. 验证可用性 1. 背景说明 本文承接Oracle ...

  2. git bash中提示 bash:node: command not found

    昨天小伙伴私信,git bash以及windows 的cmd命令行下均无法运行node npm. 究其原因是环境变量的问题.解决步骤: 1>在"此电脑"中右击,选择" ...

  3. 前端同学经常忽视的一个 JavaScript 面试题

    题目 function Foo() {     getName = function () { alert (1); };     return this; } Foo.getName = funct ...

  4. UVA1464 Traffic Real Time Query System

    传送门:https://www.luogu.com.cn/problem/UVA1464 看到这道题,求必经的点数,还是无向图.那么妥妥的圆方树.圆方树上的任意两圆点间的路径必定是圆点方点相交错的,对 ...

  5. 洛谷 P1220 关路灯 区间DP

    题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...

  6. MySQL入门(函数、条件、连接)

    MySQL入门(四) distinct:去重 mysql>: create table t1( id int, x int, y int ); mysql>: insert into t1 ...

  7. selenium报错Element is not clickable at point及四种解决方法

    使用Selenium时,触发点击事件,经常报如下异常:Element is not clickable at point 1.未加载没加载出来就等待元素加载出来,再往下执行.可以使用python库ti ...

  8. 01 flask源码剖析之werkzurg 了解wsgi

    01 werkzurg了解wsgi 目录 01 werkzurg了解wsgi 1. wsgi 2. flask之werkzurg源码流程 3. 总结 1. wsgi django和flask内部都没有 ...

  9. Python模块04/包/logging日志

    Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...

  10. 深度剖析分布式单点登录框架XXL-SSO

    于2018年初,在github上创建XXL-SSO项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计-- 于2018年初,在github上创建XXL-SSO项目仓库并提交第一个 ...