AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Spring擴展點之ImportBeanDefinitionRegistrar

來源: 責編: 時間:2023-09-28 10:03:46 300觀看
導讀一、是什么?查看接口注釋:根據給定的注釋元數據,根據需要注冊bean定義......spring會遍歷所有的beanDefinition,逐個創建對應的bean。public interface ImportBeanDefinitionRegistrar { /** * Register bean definition

8nh28資訊網——每日最新資訊28at.com

一、是什么?

查看接口注釋:根據給定的注釋元數據,根據需要注冊bean定義......spring會遍歷所有的beanDefinition,逐個創建對應的bean。8nh28資訊網——每日最新資訊28at.com

public interface ImportBeanDefinitionRegistrar {	/**	 * Register bean definitions as necessary based on the given annotation metadata of	 * the importing {@code @Configuration} class.......(截取部分注釋)	 */	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,			BeanNameGenerator importBeanNameGenerator) {		registerBeanDefinitions(importingClassMetadata, registry);	}	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {	}}

PS:創建bean還有哪些方式?8nh28資訊網——每日最新資訊28at.com

1、@Component、@Bean等等2、@Import(導入類)3、實現ImportSelector接口,重寫selectImports方法,返回需要導入的全類名4、實現ImportBeanDefinitionRegistrar接口,注冊bean定義

二、demo案例

StudentBean:學生類。8nh28資訊網——每日最新資訊28at.com

public class StudentBean {    private String stuName;    public String getStuName() {        return stuName;    }    public void setStuName(String stuName) {        this.stuName = stuName;    }}

StudentImportBeanDefinitionRegistrar:實現ImportBeanDefinitionRegistrar接口。8nh28資訊網——每日最新資訊28at.com

@Componentpublic class StudentImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {    @Override    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {        // 創建beanDefinitionBuilder        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(StudentBean.class);        beanDefinitionBuilder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);        // 獲取beanDefinition        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();        BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(beanDefinition, StudentBean.class.getSimpleName());        // 注冊beanDefinition        BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry);    }}

啟動類:使用@Import導入StudentImportBeanDefinitionRegistrar類。8nh28資訊網——每日最新資訊28at.com

@Import(StudentImportBeanDefinitionRegistrar.class)@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);        StudentBean studentBean = applicationContext.getBean(StudentBean.class);        System.out.println("studentBean: " + studentBean);    }}

8nh28資訊網——每日最新資訊28at.com

我們大都習慣使用@Enable***方式引入某個組件,此處可稍作改造。8nh28資訊網——每日最新資訊28at.com

新增注解:EnableStudentBean。8nh28資訊網——每日最新資訊28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(StudentImportBeanDefinitionRegistrar.class)public @interface EnableStudentBean {}

啟動類修改:8nh28資訊網——每日最新資訊28at.com

@EnableStudentBean@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);        StudentBean studentBean = applicationContext.getBean(StudentBean.class);        System.out.println("studentBean: " + studentBean);    }}

三、ImportBeanDefinitionRegistrar在其他開源項目中的使用

mybatis

在使用mybatis時,我們需要指定mapper的掃描路徑:8nh28資訊網——每日最新資訊28at.com

@MapperScan(basePackages = "com.test.demo.dao.mapper")

查看@MapperScan源碼,發現導入了MapperScannerRegistrar類,該類實現了ImportBeanDefinitionRegistrar接口。8nh28資訊網——每日最新資訊28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(MapperScannerRegistrar.class)@Repeatable(MapperScans.class)public @interface MapperScan

MapperScannerRegistrar類(截取部分代碼):8nh28資訊網——每日最新資訊28at.com

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar {  @Override  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {    // 獲取MapperScan注解    AnnotationAttributes mapperScanAttrs = AnnotationAttributes        .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));    if (mapperScanAttrs != null) {      // 掃描對應的mapper接口,并注冊BeanDefinition(bean定義)      registerBeanDefinitions(importingClassMetadata, mapperScanAttrs, registry,          generateBaseBeanName(importingClassMetadata, 0));    }  }}

Openfeign

在使用OpenFeign時,我們需要指定feign接口掃描路徑:8nh28資訊網——每日最新資訊28at.com

@EnableFeignClients(basePackages = ""com.test.demo")

查看@EnableFeignClients源碼,發現導入了FeignClientsRegistrar類,該類實現了ImportBeanDefinitionRegistrar接口。8nh28資訊網——每日最新資訊28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients

FeignClientsRegistrar類(截取部分代碼):8nh28資訊網——每日最新資訊28at.com

class FeignClientsRegistrar	implements ImportBeanDefinitionRegistrar {	@Override	public void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {		registerDefaultConfiguration(metadata, registry);    registerFeignClients(metadata, registry);	}}

掃描所有加了@FeignClient注解的接口,接著注冊FeignClientFactoryBean類型的BeanDefinition到容器中,需要使用時生成具體的接口代理實現服務調用。8nh28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-11778-0.htmlSpring擴展點之ImportBeanDefinitionRegistrar

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java中數據共享和同步問題,導致線程安全性問題和競態條件

下一篇: Python Qt6 真的值得學習嗎?看看這些你就知道了!

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 6月iOS設備性能榜:M2穩居榜首 A系列只能等一手3nm來救

    沒有新品發布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產生的排名變動,畢竟蘋果新品的發布節奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • 量化指標是與非:挽救被量化指標扼殺的技術團隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術總監劉新翠在WOT2023大會上的主題分享,更多精彩內容及現場PPT,請關注51CTO技術棧公眾號,發消息【WOT2023PPT】即可直接領取
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
Top