国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Spring運(yùn)行時動態(tài)注冊bean的方法

2024-07-14 08:41:55
字體:
供稿:網(wǎng)友

在spring運(yùn)行時,動態(tài)的添加bean,dapeng框架在解析xml的字段時,使用到了動態(tài)注冊,注冊了一個實(shí)現(xiàn)了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("我是動態(tài)注冊的你,不是容器啟動的時候注冊的你");  }  public String toAction(String content){    return "-->" + userService.doService(content);  }}

需要注意的是,如果要注入UserService,需要提供它的getter和setter方法

現(xiàn)在啟動springboot工程,顯而易見這個類是不會被Spring管理的,接下來我們定義一個獲取Spring上下文的工具類,如下

工具類

public class SpringContextUtil {  private static ApplicationContext applicationContext;  //獲取上下文  public static ApplicationContext getApplicationContext() {    return applicationContext;  }  //設(shè)置上下文  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的啟動類中,保存當(dāng)前Spring上下文,代碼如下:

@SpringBootApplicationpublic class HelloApplication {  public static void main(String[] args) {    ApplicationContext app = SpringApplication.run(HelloApplication.class, args);    SpringContextUtil.setApplicationContext(app);  }  }

然后我們在另一個被Spring管理的容器中,寫如下方法,進(jìn)行bean的動態(tài)注冊

@GetMapping("/bean")public String registerBean() {  //將applicationContext轉(zhuǎn)換為ConfigurableApplicationContext  ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();  // 獲取bean工廠并轉(zhuǎn)換為DefaultListableBeanFactory  DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();  // 通過BeanDefinitionBuilder創(chuàng)建bean定義  BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserController.class);      // 設(shè)置屬性userService,此屬性引用已經(jīng)定義的bean:userService,這里userService已經(jīng)被spring容器管理了.  beanDefinitionBuilder.addPropertyReference("userService", "userService");  // 注冊bean  defaultListableBeanFactory.registerBeanDefinition("userController", beanDefinitionBuilder.getRawBeanDefinition());  UserController userController = (UserController) SpringContextUtil.getBean("userController");  return userController.toAction("動態(tài)注冊生成調(diào)用");   //刪除bean.  //defaultListableBeanFactory.removeBeanDefinition("testService");}

如上,就能動態(tài)的注冊bean

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗水县| 盐城市| 陵水| 砀山县| 彭州市| 渑池县| 郎溪县| 德格县| 乌拉特中旗| 金沙县| 石柱| 长寿区| 沙坪坝区| 武定县| 贵阳市| 泸溪县| 巢湖市| 奇台县| 青州市| 台中市| 遂溪县| 寿阳县| 十堰市| 辛集市| 枞阳县| 吴川市| 新龙县| 福海县| 正镶白旗| 遂川县| 南昌县| 兴宁市| 富锦市| 浦东新区| 梁山县| 惠水县| 尖扎县| 宁河县| 迁安市| 卓尼县| 石河子市|