欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Spring运行时动态注册bean的方法

时间:2021-02-14 11:31:48|栏目:JAVA代码|点击:

在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

上一篇:Java实现TopK问题的方法

栏    目:JAVA代码

下一篇:java数组、泛型、集合在多态中的使用及对比

本文标题:Spring运行时动态注册bean的方法

本文地址:http://www.codeinn.net/misctech/62947.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有