中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring運行時動態注冊bean的方法

發布時間:2020-09-17 21:34:25 來源:腳本之家 閱讀:344 作者:楓葉maple 欄目:編程語言

在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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郑州市| 饶阳县| 兴山县| 江安县| 巫山县| 高淳县| 西畴县| 即墨市| 抚宁县| 招远市| 通道| 徐汇区| 花莲市| 义马市| 隆德县| 滦平县| 方山县| 邵东县| 石门县| 湖南省| 保康县| 梓潼县| 阳山县| 博罗县| 武平县| 宝坻区| 阿拉尔市| 册亨县| 广丰县| 蛟河市| 正宁县| 延庆县| 西昌市| 南通市| 拜城县| 临沭县| 澜沧| 金乡县| 济源市| 聂拉木县| 伊川县|