亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

陈巴尔虎旗| 通河县| 金昌市| 平罗县| 恩平市| 阿尔山市| 平南县| 大宁县| 盐源县| 昌黎县| 鄂伦春自治旗| 通辽市| 漠河县| 大宁县| 蕲春县| 丰顺县| 雅江县| 永福县| 洪雅县| 湖南省| 鄱阳县| 东乌珠穆沁旗| 新宁县| 南乐县| 曲阜市| 连江县| 娱乐| 潍坊市| 兴义市| 德保县| 华池县| 高淳县| 康乐县| 明星| 绥中县| 扎囊县| 古交市| 石门县| 临澧县| 文昌市| 呼图壁县|