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