动态注册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

目录
相关文章
|
20天前
|
XML 安全 Java
|
2天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
19 6
|
4天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
32 3
|
18天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
7月前
|
XML Java 数据格式
Spring IoC容器初始化过程(xml形式)
Spring IoC容器初始化过程(xml形式)
85 0
|
7月前
|
XML Java 数据格式
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
71 1
|
XML Java 数据格式
Spring源码阅读-IOC容器初始化过程
Spring IOC容器的初始化过程:Resource定位,BeanDefinition载入,向IOC容器注册BeanDefinition。整个过程由refresh()方法触发,三个过程由不同的模块完成,使用户更加灵活的对这三个过程剪裁和扩展。
165 0
|
XML JavaScript Java
Spring IoC容器初始化过程(xml形式)
Resource是Spring中用于封装I/O操作的接口,在创建Spring的容器的时候,会根据xml对应配置的类型,加载不同的数据类型
80 0
|
XML 设计模式 Java
「推荐收藏!」【Spring源码探究】(一)IOC容器初始化🏅彻底让你明白运行原理和源码流程
「推荐收藏!」【Spring源码探究】(一)IOC容器初始化🏅彻底让你明白运行原理和源码流程
137 0
「推荐收藏!」【Spring源码探究】(一)IOC容器初始化🏅彻底让你明白运行原理和源码流程
下一篇
DataWorks