java开发中动态注册bean到spring框架容器

原先的设计是通过已有的库,将数据通过rmi写入到远程服务器;现在有需求需要将支持多个,而且是自定义的远程服务器ip。

因为整个接口原先都是通过spring配置文件,包括rmi的地址。同时,为了维护方便,不能直接将打好的jar包拿过来改,于是就采用了复制原有的bean definition,动态注册新的bean到那个spring容器中。

首先需要获取jar包中的spring容器,这里需要将applicationContext接口转换成为真正的实现:DefaultListableBeanFactory,这样才能使用其中的注册和获取beandefinition方法。

当要获取bean的时候,首先先通过beanfactory的containsBean方法判断是否已经有bean了,如果没有,就继续以下的步骤:

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了

整个过程非常简单,其中注意一个地方,就是MutablePropertyValues和spring配置文件的关系。一个beandefinition的MutablePropertyValues就是配置文件中的一系列property标签,可以获取其中的value。如果property是一个bean,那个获取过来的Object对象,是BeanDefinitionHolder对象,就是对属性中引用bean的定义,以此类推。

比如,spring的配置文件里面有这样的bean定义:

 代码如下 复制代码
<bean id="a" class="x.y.z.A">
    <property name="p1" value="test" />
    <property name="p2">
        <bean class="x.y.z.B" />
    </propery>
</bean>

那么通过getPropertyValues()方法获取到的MutablePropertyValues就包含两个属性,可以通过MutablePropertyValues的getPropertyValue(“p1″)获取到test这个值,getPropertyValue(“p2″)获取到的就是x.y.z.B这个类对应的beandefinition。

时间: 2024-10-28 23:28:10

java开发中动态注册bean到spring框架容器的相关文章

动态注册bean到spring容器

原先的设计是通过已有的库,将数据通过rmi写入到远程服务器:现在有需求需要将支持多个,而且是自定义的远程服务器ip. 因为整个接口原先都是通过spring配置文件,包括rmi的地址.同时,为了维护方便,不能直接将打好的jar包拿过来改,于是就采用了复制原有的bean definition,动态注册新的bean到那个spring容器中. 首先需要获取jar包中的spring容器,这里需要将applicationContext接口转换成为真正的实现:DefaultListableBeanFactor

Java开发中的23种设计模式详解(转)

Java开发中的23种设计模式详解(转) 设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合

java开发中基于JDBC连接数据库实例总结_java

本文实例讲述了java开发中基于JDBC连接数据库的方法.分享给大家供大家参考,具体如下: 创建一个以JDBC连接数据库的程序,包含7个步骤:   1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ;

registerreceiver-&amp;amp;lt;meta-data&amp;amp;gt;配置&amp;amp;lt;receiver&amp;amp;gt;的java代码实现(动态注册)

问题描述 <meta-data>配置<receiver>的java代码实现(动态注册) 希望能够实现广播的动态注册,有没有大神指导一下,感激不尽. 现在是在AndroidManifest.xml中静态注册,希望能够使用代码动态注册 涉及动态注册部分代码 String USB_DEVICE_ATTACHED = "android.hardware.usb.action.USB_DEVICE_ATTACHED"; intentFilter = new IntentF

Java开发中异常处理的最佳实践

异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中.Java 编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们.事实上,在Java编程中,Java的异常处理不单单是知道语法这么简单,它必须遵循标准的JDK库,和几个处理错误和异常的开源代码.这里我们将讨论一些关于异常处

java开发中:用户、订单、订单详情、商品之间的关系 搞不清

问题描述 java开发中:用户.订单.订单详情.商品之间的关系 搞不清 此案例的业务关系是用户.订单.订单详情.商品之间的关系,其中, 一个订单只能属于一个人. 一个订单可以有多个订单详情. 一个订单详情中包含一个商品信息. 所以它们的关系是如下: 订单和人是 一对一的关系. 订单和订单详情是 一对多 的关系. 订单和商品是 多对多的关系. 明明人和订单是一对多,为什么说成了一对一,订单和商品又怎么是多对多的关系? 求解 解决方案 最近在oracle数据库里刚学了交易系统表结构的设计,来说说我的

android-安卓的开发中动态图片背景的设计

问题描述 安卓的开发中动态图片背景的设计 请问大牛,如何在控件背景上添加动态图片,例如gif 格式的图片怎么作为控件背景使用!? 解决方案 写一个自定义的gifView继承View用于播放gif图片http://www.open-open.com/lib/view/open1423121900389.html 解决方案二: 你可以用一组图片,用代码来循环切换,达到动画效果. 解决方案三: 使用android显示动态Gif图片:http://blog.sina.com.cn/s/blog_73c5

开放-java开发中,一般涉及到金钱计算的时候用什么数据类型?

问题描述 java开发中,一般涉及到金钱计算的时候用什么数据类型? java开发中,一般涉及到金钱计算的时候用什么数据类型?精度尽量高 解决方案 BigDecimal类把数字封装再进行运算就可以精确运算 解决方案二: 其实用integer或者long整体放大100倍就可以了.精确到1分钱.最大可以表示4200万(对于int),至于long,表示的更是天文数字了. 解决方案三: BigDecimal一般用在货币计算 解决方案四: BigDecimal 解决方案五: BigDecimal可以表示任意

Java开发中对算法的要求高么,大神进来看看

问题描述 Java开发中对算法的要求高么,本人最近要参加一个叫蓝桥杯的比赛,考核的内容偏重与算法,可能参加了这个比赛可能对自己算法方面有提高,与现在学的框架,web技术好像根本没有关系,况且,报名费就300,给人的感觉不是很好.....不知道算法这个东西在实际工作中用的如何,还望大神指点 解决方案 解决方案二:不管是什么语言,算法都是很重要的解决方案三:蓝桥杯还行吧,虽然比acm水,但还是有一定含金量的.解决方案四:重要,而且算法是通用的,转其他语言也用得到.解决方案五:一个字:很重要解决方案六