摘要:之動態注冊什么場景下,需要主動向容器注冊呢如我之前做個的一個支持掃表的基礎平臺,使用者只需要添加基礎配置任務,就可以丟到這個平臺上面來運行了,而這個基礎平臺是一直都在運行的,所以在新來任務時,最直觀需要注冊的就是數據源這個了,那么可以怎么玩
Spring之動態注冊bean
什么場景下,需要主動向Spring容器注冊bean呢?
如我之前做個的一個支持掃表的基礎平臺,使用者只需要添加基礎配置 + Groovy任務,就可以丟到這個平臺上面來運行了,而這個基礎平臺是一直都在運行的,所以在新來任務時,最直觀需要注冊的就是 DataSource 數據源這個bean了,那么可以怎么玩?
I. 主動注冊Bean支持借助BeanDefinition來實現bean的定義,從最終的使用來看,代碼比較少,幾行而已
publicT registerBean(String name, Class clazz, Object... args) { BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); if (args.length > 0) { for (Object arg : args) { beanDefinitionBuilder.addConstructorArgValue(arg); } } BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition(); BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory(); beanFactory.registerBeanDefinition(name, beanDefinition); return applicationContext.getBean(name, clazz); }
測試如下
import com.github.hui.story.quickstory.server.VisitService; import lombok.ToString; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; @Component public class BeanHolder { private final ConfigurableApplicationContext applicationContext; public BeanHolder(ConfigurableApplicationContext applicationContext) { this.applicationContext = applicationContext; initSer(); } public void initSer() { InrSer ser = registerBean("test", InrSer.class); ser.name = "一灰"; ser.uid = 22; System.out.println(ser); InrSer ser2 = registerBean("test2", InrSer.class, "一灰灰Blog", 20); System.out.println(ser2); } @ToString public static class InrSer { private String name; private Integer uid; @Autowired private VisitService visitService; public InrSer() { } public InrSer(String name, Integer uid) { this.name = name; this.uid = uid; } } privateT registerBean(String name, Class clazz, Object... args) { BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz); if (args.length > 0) { for (Object arg : args) { beanDefinitionBuilder.addConstructorArgValue(arg); } } BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition(); BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory(); beanFactory.registerBeanDefinition(name, beanDefinition); return applicationContext.getBean(name, clazz); } }
輸出如下
II. 其他 1. 一灰灰Blog: https://liuyueyi.github.io/he...一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關注小灰灰Blog&公眾號
知識星球
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76619.html
摘要:在上文中,我實現了一個很簡單的和容器。比如,我們所熟悉的就是在這里將切面邏輯織入相關中的。初始化的工作算是結束了,此時處于就緒狀態,等待外部程序的調用。其中動態代理只能代理實現了接口的對象,而動態代理則無此限制。 1. 背景 本文承接上文,來繼續說說 IOC 和 AOP 的仿寫。在上文中,我實現了一個很簡單的 IOC 和 AOP 容器。上文實現的 IOC 和 AOP 功能很單一,且 I...
摘要:同時,所標注的需要被應用上下文注冊配置引導類創建配置上下文注冊當前配置獲取和獲取獲取運行結果運行后控制臺輸出輸出的內容與綁定的內容一致,符合期望。 Dubbo 外部化配置(Externalized Configuration) 原文地址 外部化配置(Externalized Configuration) 在Dubbo 注解驅動例子中,無論是服務提供方,還是服務消費方,均需要轉配相關配置...
摘要:與的區別是處理的對象不同,是對進行處理,是對進行處理。可以在初始化完成,所有屬性設置完成后執行特定邏輯,例如對自動裝配對屬性進行驗證等等。用于在被銷毀前執行特定的邏輯,例如做一些回收工作等。用來監聽的標準應用事件或者自定義事件。 可以選擇如下一些擴展點: ▌1.BeanFactoryPostProcessor是beanFactory后置處理器,支持在bean factory標準初始化完...
摘要:會一直完善下去,歡迎建議和指導,同時也歡迎中用到了那些設計模式中用到了那些設計模式這兩個問題,在面試中比較常見。工廠設計模式使用工廠模式可以通過或創建對象。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://github.com/Snailclimb... JDK 中用到了那...
摘要:不過那個實現太過于簡單,和,相去甚遠。在接下來文章中,我也將從易到難,實現不同版本的和。切面切面包含了通知和切點,通知和切點共同定義了切面是什么,在何時,何處執行切面邏輯。 1. 背景 我在大四實習的時候開始接觸 J2EE 方面的開發工作,也是在同時期接觸并學習 Spring 框架,到現在也有快有兩年的時間了。不過之前沒有仿寫過 Spring IOC 和 AOP,只是宏觀上對 Spri...
閱讀 2556·2021-11-22 12:05
閱讀 3442·2021-10-14 09:42
閱讀 1675·2021-07-28 00:15
閱讀 1982·2019-08-30 11:08
閱讀 1476·2019-08-29 17:31
閱讀 920·2019-08-29 16:42
閱讀 2329·2019-08-26 11:55
閱讀 2108·2019-08-26 11:49