摘要:之動態(tài)注冊什么場景下,需要主動向容器注冊呢如我之前做個的一個支持掃表的基礎(chǔ)平臺,使用者只需要添加基礎(chǔ)配置任務(wù),就可以丟到這個平臺上面來運(yùn)行了,而這個基礎(chǔ)平臺是一直都在運(yùn)行的,所以在新來任務(wù)時,最直觀需要注冊的就是數(shù)據(jù)源這個了,那么可以怎么玩
Spring之動態(tài)注冊bean
什么場景下,需要主動向Spring容器注冊bean呢?
如我之前做個的一個支持掃表的基礎(chǔ)平臺,使用者只需要添加基礎(chǔ)配置 + Groovy任務(wù),就可以丟到這個平臺上面來運(yùn)行了,而這個基礎(chǔ)平臺是一直都在運(yùn)行的,所以在新來任務(wù)時,最直觀需要注冊的就是 DataSource 數(shù)據(jù)源這個bean了,那么可以怎么玩?
I. 主動注冊Bean支持借助BeanDefinition來實(shí)現(xiàn)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...一灰灰的個人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內(nèi)容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關(guān)注小灰灰Blog&公眾號
知識星球
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76619.html
摘要:在上文中,我實(shí)現(xiàn)了一個很簡單的和容器。比如,我們所熟悉的就是在這里將切面邏輯織入相關(guān)中的。初始化的工作算是結(jié)束了,此時處于就緒狀態(tài),等待外部程序的調(diào)用。其中動態(tài)代理只能代理實(shí)現(xiàn)了接口的對象,而動態(tài)代理則無此限制。 1. 背景 本文承接上文,來繼續(xù)說說 IOC 和 AOP 的仿寫。在上文中,我實(shí)現(xiàn)了一個很簡單的 IOC 和 AOP 容器。上文實(shí)現(xiàn)的 IOC 和 AOP 功能很單一,且 I...
摘要:同時,所標(biāo)注的需要被應(yīng)用上下文注冊配置引導(dǎo)類創(chuàng)建配置上下文注冊當(dāng)前配置獲取和獲取獲取運(yùn)行結(jié)果運(yùn)行后控制臺輸出輸出的內(nèi)容與綁定的內(nèi)容一致,符合期望。 Dubbo 外部化配置(Externalized Configuration) 原文地址 外部化配置(Externalized Configuration) 在Dubbo 注解驅(qū)動例子中,無論是服務(wù)提供方,還是服務(wù)消費(fèi)方,均需要轉(zhuǎn)配相關(guān)配置...
摘要:與的區(qū)別是處理的對象不同,是對進(jìn)行處理,是對進(jìn)行處理??梢栽诔跏蓟瓿桑袑傩栽O(shè)置完成后執(zhí)行特定邏輯,例如對自動裝配對屬性進(jìn)行驗(yàn)證等等。用于在被銷毀前執(zhí)行特定的邏輯,例如做一些回收工作等。用來監(jiān)聽的標(biāo)準(zhǔn)應(yīng)用事件或者自定義事件。 可以選擇如下一些擴(kuò)展點(diǎn): ▌1.BeanFactoryPostProcessor是beanFactory后置處理器,支持在bean factory標(biāo)準(zhǔn)初始化完...
摘要:會一直完善下去,歡迎建議和指導(dǎo),同時也歡迎中用到了那些設(shè)計(jì)模式中用到了那些設(shè)計(jì)模式這兩個問題,在面試中比較常見。工廠設(shè)計(jì)模式使用工廠模式可以通過或創(chuàng)建對象。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識點(diǎn)以及面試問題,已經(jīng)開源,目前已經(jīng) 41k+ Star。會一直完善下去,歡迎建議和指導(dǎo),同時也歡迎Star: https://github.com/Snailclimb... JDK 中用到了那...
摘要:不過那個實(shí)現(xiàn)太過于簡單,和,相去甚遠(yuǎn)。在接下來文章中,我也將從易到難,實(shí)現(xiàn)不同版本的和。切面切面包含了通知和切點(diǎn),通知和切點(diǎn)共同定義了切面是什么,在何時,何處執(zhí)行切面邏輯。 1. 背景 我在大四實(shí)習(xí)的時候開始接觸 J2EE 方面的開發(fā)工作,也是在同時期接觸并學(xué)習(xí) Spring 框架,到現(xiàn)在也有快有兩年的時間了。不過之前沒有仿寫過 Spring IOC 和 AOP,只是宏觀上對 Spri...
閱讀 2568·2021-11-22 12:05
閱讀 3454·2021-10-14 09:42
閱讀 1687·2021-07-28 00:15
閱讀 1990·2019-08-30 11:08
閱讀 1487·2019-08-29 17:31
閱讀 932·2019-08-29 16:42
閱讀 2340·2019-08-26 11:55
閱讀 2119·2019-08-26 11:49