91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

图片| 大荔县| 芮城县| 潼南县| 华安县| 兴海县| 密云县| 科技| 左云县| 玛纳斯县| 桦甸市| 西丰县| 资中县| 定远县| 江西省| 英超| 胶州市| 方山县| 新兴县| 崇礼县| 定州市| 周宁县| 沧州市| 富民县| 吉林市| 利津县| 曲阜市| 鸡泽县| 财经| 增城市| 郎溪县| 和田市| 迁安市| 双江| 石泉县| 丹寨县| 胶南市| 漳浦县| 昭苏县| 彝良县| 东光县|