动态注册 Bean 到 Spring 中

  1. 1. 动态注册 Bean 的几种方式
    1. 1.1. 1. Singleton Bean 注册
    2. 1.2. 2. BeanDefinition 注册

如果需要要启动后向 Spring 容器个注册一个动态创建的对象,可以通过以下几个方式实现:

  1. 直接注册 Singleton 对象
  2. 注册 BeanDefinition

动态注册 Bean 的几种方式

1. Singleton Bean 注册

单例对象可以直接通过以下代码注册,这种方式不适用于其它 Scope 的情况,但优点是可以自己 new 好对象。

1
beanFactory.registerSingleton(name, bean);

2. BeanDefinition 注册

Spring 应用中可以使用 BeanDefinitionRegistry 类的下面方法注册一个 BeanDefinition

1
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

这种注册方法更通用,Spring 本身也是通过构造 BeanDefinition 来注册 Bean 的。BeanDefinition 对象我们可以手动创建,也可以使用 BeanDefinitionBuilder 来构建,builder 的方式编码体验好很多。

1
2
3
4
5
BeanDefinitionBuilder b =
BeanDefinitionBuilder.rootBeanDefinition(Bean.class)
.addPropertyValue("attr", "value");

registry.registerBeanDefinition("bean", b.getBeanDefinition());

registry 可以使用以下方式获取

1
BeanDefinitionRegistry registry = (BeanDefinitionRegistry)  context.getAutowireCapableBeanFactory();