淘客网站开发视频教程,刷赞网站推广qq免费,linux下wordpress建站,网站开发公司业务员培训2019独角兽企业重金招聘Python工程师标准 我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入对象.因为如果采用配置文件或者注解#xff0c;我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bea… 2019独角兽企业重金招聘Python工程师标准 我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入对象.因为如果采用配置文件或者注解我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bean,包括动态注入,动态删除。 本节大纲 1动态注入bean思路 2动态注入实现代码 3多次注入同一个bean的情况 4动态删除 接下来我们看下具体的内容 1动态注入bean思路 在具体进行代码实现的时候我们要知道Spring管理bean的对象是BeanFactory具体的是DefaultListableBeanFactory在这个类当中有一个注入bean的方法registerBeanDefinition在调用registerBeanDefinition方法时需要BeanDefinition参数那么这个参数怎么获取呢Spring提供了BeanDefinitionBuilder可以构建一个BeanDefinition那么我们的问题就是如何获取BeanFactory了这个就很简单了只要获取到ApplicationContext对象即可获取到BeanFacory了。 2动态注入实现代码 综上所述如果我们要编写一个简单里的例子的话那么分以个几个步骤进行编码即可进行动态注入了 1. 获取ApplicationContext; 2. 通过ApplicationContext获取到BeanFacotory; 3. 通过BeanDefinitionBuilder构建BeanDefiniton; 4. 调用beanFactory的registerBeanDefinition注入beanDefinition 5. 使用ApplicationContext.getBean获取bean进行测试 很明显我们需要先定义个类进行测试比如TestService代码如下 /** * 动态注入的service. * author Angel -- 守护天使 * version v.0.1 * date 2017年1月2日 */ package com.kfit.demo.service; public class TestService { private String name; public String getName() { return name; } public void setName(String name) { this.name name; } public void print(){ System.out.println(动态载入bean,namename); } } 注意这里没有使用Service和配置文件进行注入TestService。 那么下面我们的目标就是动态注入TestService了根据以上的分析我们进行编码具体代码如下 //获取context. -- Angel -守护天使 ApplicationContext ctx (ApplicationContext) SpringApplication.run(App.class, args); //获取BeanFactory DefaultListableBeanFactory defaultListableBeanFactory (DefaultListableBeanFactory)ctx.getAutowireCapableBeanFactory(); //创建bean信息. BeanDefinitionBuilderbeanDefinitionBuilder BeanDefinitionBuilder.genericBeanDefinition(TestService.class); beanDefinitionBuilder.addPropertyValue(name,张三); //动态注册bean. defaultListableBeanFactory.registerBeanDefinition(testService,beanDefinitionBuilder.getBeanDefinition()); //获取动态注册的bean. TestService testService ctx.getBean(TestService.class);、testService.print(); 执行代码我们会在控制台看到如下打印信息 动态载入bean,name张三 到这里就证明我们的代码很成功了。 3多次注入同一个bean的情况 多次注入同一个bean的如果beanName不一样的话那么会产生两个Bean如果beanName一样的话后面注入的会覆盖前面的。 第一种情况beanName一样的代码 beanDefinitionBuilder BeanDefinitionBuilder.genericBeanDefinition(TestService.class); beanDefinitionBuilder.addPropertyValue(name,李四); defaultListableBeanFactory.registerBeanDefinition(testService, beanDefinitionBuilder.getBeanDefinition()); 运行看控制台 动态载入bean,name李四 第二种情况beanName不一样的代码 beanDefinitionBuilder BeanDefinitionBuilder.genericBeanDefinition(TestService.class); beanDefinitionBuilder.addPropertyValue(name,李四); defaultListableBeanFactory.registerBeanDefinition(testService1,beanDefinitionBuilder.getBeanDefinition()); 此时如果没有更改别的代码直接运行的话是会报如下错误的 Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.kfit.demo.service.TestService] is defined: expected single matching bean but found 2: testService1,testService 大体意思就是在getBean的时候找到了两个bean这时候就不知道要获取哪个了所以在获取的时候我们就要指定我们是要获取的testService还是testService1只需要修改一句代码 将代码 TestService testService ctx.getBean(TestService.class); 修改为 TestService testService ctx.getBean(testService); 4动态删除 相对于动态注入动态删除就很简单了直接奉上代码 //删除bean. defaultListableBeanFactory.removeBeanDefinition(testService); 转载于:https://my.oschina.net/xiaominmin/blog/1607727