亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Spring之動(dòng)態(tài)注冊(cè)bean

denson / 3003人閱讀

摘要:之動(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)看,代碼比較少,幾行而已

public  T 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;
        }
    }

    private  T 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

相關(guān)文章

  • 仿照 Spring 實(shí)現(xiàn)簡(jiǎn)單的 IOC 和 AOP - 下篇

    摘要:在上文中,我實(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...

    AlexTuan 評(píng)論0 收藏0
  • Dubbo 新編程模型外部化配置

    摘要:同時(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)配置...

    baihe 評(píng)論0 收藏0
  • 3分鐘干貨對(duì)spring進(jìn)行定制化功能擴(kuò)展

    摘要:與的區(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)初始化完...

    changfeng1050 評(píng)論0 收藏0
  • 面試官:“談?wù)?em>Spring中都用到了那些設(shè)計(jì)模式?”。

    摘要:會(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 中用到了那...

    Astrian 評(píng)論0 收藏0
  • 仿照 Spring 實(shí)現(xiàn)簡(jiǎn)單的 IOC 和 AOP - 上篇

    摘要:不過那個(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...

    layman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<