Spring运行时动态注册bean的方法
作者:枫叶maple 时间:2023-11-25 04:16:58
在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了FactoryBean类!
定义一个没有被Spring管理的Controller
public class UserController implements InitializingBean{
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("我是动态注册的你,不是容器启动的时候注册的你");
}
public String toAction(String content){
return "-->" + userService.doService(content);
}
}
需要注意的是,如果要注入UserService,需要提供它的getter和setter方法
现在启动springboot工程,显而易见这个类是不会被Spring管理的,接下来我们定义一个获取Spring上下文的工具类,如下
工具类
public class SpringContextUtil {
private static ApplicationContext applicationContext;
//获取上下文
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//设置上下文
public static void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
}
//通过名字获取上下文中的bean
public static Object getBean(String name){
return applicationContext.getBean(name);
}
//通过类型获取上下文中的bean
public static Object getBean(Class<?> requiredType){
return applicationContext.getBean(requiredType);
}
}
我们在Springboot的启动类中,保存当前Spring上下文,代码如下:
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
ApplicationContext app = SpringApplication.run(HelloApplication.class, args);
SpringContextUtil.setApplicationContext(app);
}
}
然后我们在另一个被Spring管理的容器中,写如下方法,进行bean的动态注册
@GetMapping("/bean")
public String registerBean() {
//将applicationContext转换为ConfigurableApplicationContext
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();
// 获取bean工厂并转换为DefaultListableBeanFactory
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
// 通过BeanDefinitionBuilder创建bean定义
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserController.class);
// 设置属性userService,此属性引用已经定义的bean:userService,这里userService已经被spring容器管理了.
beanDefinitionBuilder.addPropertyReference("userService", "userService");
// 注册bean
defaultListableBeanFactory.registerBeanDefinition("userController", beanDefinitionBuilder.getRawBeanDefinition());
UserController userController = (UserController) SpringContextUtil.getBean("userController");
return userController.toAction("动态注册生成调用");
//删除bean.
//defaultListableBeanFactory.removeBeanDefinition("testService");
}
如上,就能动态的注册bean
来源:https://www.cnblogs.com/leihuazhe/p/8137564.html
标签:Spring,动态,注册,bean
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android开发之TimePicker控件用法实例详解
2022-02-10 10:18:50
![](https://img.aspxhome.com/file/2023/2/106042_0s.png)
Java中JSON处理工具类使用详解
2023-09-19 17:59:08
C#实现DataTable转TXT、CSV文件
2022-08-09 06:50:09
Android主线程和子线程区别详解
2023-12-18 17:33:38
C#书写规范
2023-07-09 09:15:57
Java 中ThreadLocal类详解
2022-01-31 19:58:17
C# 嵌入dll 的方法
2022-11-06 08:39:10
![](https://img.aspxhome.com/file/2023/1/116591_0s.png)
spring使用JavaConfig进行配置的方法
2023-08-22 20:52:46
![](https://img.aspxhome.com/file/2023/8/72298_0s.png)
C# 文字代码页 文字编码的代码页名称速查表
2023-12-13 04:03:54
SpringBoot遇到的坑@Qualifier报红的解决
2022-06-03 07:49:55
![](https://img.aspxhome.com/file/2023/5/66965_0s.png)
Android 13新功能及适配工作详解
2022-04-13 11:05:33
C#格式化json字符串的方法分析
2023-12-23 00:20:36
C#深浅拷贝的深入解析
2023-03-28 18:36:28
![](https://img.aspxhome.com/file/2023/1/84481_0s.png)
详解 Java中日期数据类型的处理之格式转换的实例
2021-12-29 05:17:49
C#正则表达式Regex类的用法
2022-06-07 13:44:58
c++函数指针使用示例分享
2022-01-20 17:48:26
![](https://img.aspxhome.com/file/2023/5/122565_0s.jpg)
Android编程中activity的完整生命周期实例详解
2022-12-24 05:39:40
![](https://img.aspxhome.com/file/2023/5/137525_0s.png)
Android实现读取NFC卡的编号
2021-07-13 11:19:21
Java类加载器ClassLoader用法解析
2023-05-05 21:46:38
Java基础详解之集合框架工具Collections
2021-11-09 02:40:32