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
0
投稿

猜你喜欢

  • Android开发之TimePicker控件用法实例详解

    2022-02-10 10:18:50
  • 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
  • spring使用JavaConfig进行配置的方法

    2023-08-22 20:52:46
  • C# 文字代码页 文字编码的代码页名称速查表

    2023-12-13 04:03:54
  • SpringBoot遇到的坑@Qualifier报红的解决

    2022-06-03 07:49:55
  • Android 13新功能及适配工作详解

    2022-04-13 11:05:33
  • C#格式化json字符串的方法分析

    2023-12-23 00:20:36
  • C#深浅拷贝的深入解析

    2023-03-28 18:36:28
  • 详解 Java中日期数据类型的处理之格式转换的实例

    2021-12-29 05:17:49
  • C#正则表达式Regex类的用法

    2022-06-07 13:44:58
  • c++函数指针使用示例分享

    2022-01-20 17:48:26
  • Android编程中activity的完整生命周期实例详解

    2022-12-24 05:39:40
  • Android实现读取NFC卡的编号

    2021-07-13 11:19:21
  • Java类加载器ClassLoader用法解析

    2023-05-05 21:46:38
  • Java基础详解之集合框架工具Collections

    2021-11-09 02:40:32
  • asp之家 软件编程 m.aspxhome.com