动态注册bean到spring容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 原先的设计是通过已有的库,将数据通过rmi写入到远程服务器;现在有需求需要将支持多个,而且是自定义的远程服务器ip。 因为整个接口原先都是通过spring配置文件,包括rmi的地址。同时,为了维护方便,不能直接将打好的jar包拿过来改,于是就采用了复制原有的bean definition,动态注册

原先的设计是通过已有的库,将数据通过rmi写入到远程服务器;现在有需求需要将支持多个,而且是自定义的远程服务器ip。
因为整个接口原先都是通过spring配置文件,包括rmi的地址。同时,为了维护方便,不能直接将打好的jar包拿过来改,于是就采用了复制原有的bean definition,动态注册新的bean到那个spring容器中。
首先需要获取jar包中的spring容器,这里需要将applicationContext接口转换成为真正的实现:DefaultListableBeanFactory,这样才能使用其中的注册和获取beandefinition方法。
当要获取bean的时候,首先先通过beanfactory的containsBean方法判断是否已经有bean了,如果没有,就继续以下的步骤:
[cce lang=”java”]
RootBeanDefinition remoteDataServerClientDefinition =
(RootBeanDefinition) beanFactory.getBeanDefinition(BASE_BEAN_NAME); //获取“模板”bean的定义
RootBeanDefinition remoteDataServerClientNewDefinition =
new RootBeanDefinition(remoteDataServerClientDefinition); //深度复制
MutablePropertyValues properties =
remoteDataServerClientNewDefinition.getPropertyValues(); //拿到原bean的属性
BeanDefinitionHolder defaultDataSourceFactoryDefinitionHolder = //这里获取属性值
(BeanDefinitionHolder) properties.getPropertyValue(“serviceFactory”).getValue();
//下面省略,主要是对属性值的修改和重新赋值

//向bean factory中注册新的bean,第一个参数是bean的名字,第二个参数是bean的定义
beanFactory.registerBeanDefinition(udasClientBeanName, remoteDataServerClientNewDefinition);
beanFactory.getBean(udasClientBeanName); //然后就可以从容器中拿bean了
[/cce]
整个过程非常简单,其中注意一个地方,就是MutablePropertyValues和spring配置文件的关系。一个beandefinition的MutablePropertyValues就是配置文件中的一系列property标签,可以获取其中的value。如果property是一个bean,那个获取过来的Object对象,是BeanDefinitionHolder对象,就是对属性中引用bean的定义,以此类推。
比如,spring的配置文件里面有这样的bean定义:
[cce lang=”xml”]
<bean id=”a” class=”x.y.z.A”>
<property name=”p1″ value=”test” />
<property name=”p2″>
<bean class=”x.y.z.B” />
</propery>
< /bean>
[/cce]
那么通过getPropertyValues()方法获取到的MutablePropertyValues就包含两个属性,可以通过MutablePropertyValues的getPropertyValue(“p1″)获取到test这个值,getPropertyValue(“p2″)获取到的就是x.y.z.B这个类对应的beandefinition。


转载自:https://coolex.info/blog/253.html

目录
相关文章
|
16天前
|
缓存 Java Spring
Spring 框架中 Bean 的生命周期
Spring 框架中 Bean 的生命周期
29 1
|
30天前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
39 0
|
1天前
|
Java 数据库连接 开发者
浅谈Spring的Bean生命周期
浅谈Spring的Bean生命周期
7 1
|
5天前
|
XML Java 数据格式
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
14 0
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
|
16天前
|
XML Java 程序员
作为Java程序员还不知道Spring中Bean创建过程和作用?
作为Java程序员还不知道Spring中Bean创建过程和作用?
12 0
|
20天前
|
XML 缓存 Java
天天用 Spring,bean 实例化原理你懂吗
天天用 Spring,bean 实例化原理你懂吗
14 0
|
21天前
|
Java 数据库连接 Spring
|
1月前
|
Java 容器 Spring
【spring(一)】核心容器总结
【spring(一)】核心容器总结
|
1月前
|
Java Spring
Spring5深入浅出篇:bean的生命周期
Spring5深入浅出篇:bean的生命周期
|
1月前
|
Java 开发者 容器
【Java】深入了解Spring容器的两个关键组件
【Java】深入了解Spring容器的两个关键组件
10 0