spring註解之@Import註解的三種使用方式

@[toc]javascript

一、@Import註解須知

一、@Import只能用在類上 ,@Import經過快速導入的方式實現把實例加入spring的IOC容器中java

 

二、加入IOC容器的方式有不少種,@Import註解就相對很牛皮了,@Import註解能夠用於導入第三方包 ,固然@Bean註解也能夠,可是@Import註解快速導入的方式更加便捷spring

 

三、@Import註解有三種用法

二、@Import的三種用法

@Import的三種用法主要包括:編程

一、直接填class數組方式 二、ImportSelector方式【重點】 三、ImportBeanDefinitionRegistrar方式設計模式

2.一、第一種用法:直接填class數組

直接填對應的class數組,class數組能夠有0到多個。 數組

語法以下:springboot

@Import({ 類名.class , 類名.class... })
public class TestDemo {

}
複製代碼

對應的import的bean都將加入到spring容器中,這些在容器中bean名稱是該類的全類名 ,好比com.yc.類名併發

2.二、第二種用法:ImportSelector方式【重點】

這種方式的前提就是一個類要實現ImportSelector接口,假如我要用這種方法,目標對象是Myclass這個類,分析具體以下:app

建立Myclass類並實現ImportSelector接口ide

public class Myclass implements ImportSelector {
//既然是接口確定要實現這個接口的方法
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[0];
    }
}
複製代碼

分析實現接口的selectImports方法中的:

  • 一、返回值: 就是咱們實際上要導入到容器中的組件全類名【重點
  • 二、參數: AnnotationMetadata表示當前被@Import註解給標註的全部註解信息【不是重點】

須要注意的是selectImports方法能夠返回空數組可是不能返回null,不然會報空指針異常!

以上分析完畢以後,具體用法步驟以下:

第一步:建立Myclass類並實現ImportSelector接口,這裏用於演示就添加一個全類名給其返回值

public class Myclass implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.yc.Test.TestDemo3"};
    }
}
複製代碼

第二步:編寫TestDemo 類,並標註上使用ImportSelector方式的Myclass類

@Import({TestDemo2.class,Myclass.class})
public class TestDemo {
        @Bean
        public AccountDao2 accountDao2(){
            return new AccountDao2();
        }

}
複製代碼

能夠看出,宜春故意挑了個龍套角色@Bean註解,若對@Bean註解不是很清晰的童鞋能夠參考大白話講解Spring的@bean註解

第三步:編寫打印容器中的組件測試類

/** * 打印容器中的組件測試 */
public class AnnotationTestDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestDemo.class);  //這裏的參數表明要作操做的類

        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames){
            System.out.println(name);
        }

    }
}
複製代碼

第四步:運行結果

在這裏插入圖片描述

2.三、第三種用法:ImportBeanDefinitionRegistrar方式

一樣是一個接口,相似於第二種ImportSelector用法,類似度80%,只不過這種用法比較自定義化註冊,具體以下:

第一步:建立Myclass2類並實現ImportBeanDefinitionRegistrar接口

public class Myclass2 implements ImportBeanDefinitionRegistrar {
//該實現方法默認爲空
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
      
    }
}
複製代碼

參數分析:

  • 第一個參數:annotationMetadata 和以前的ImportSelector參數同樣都是表示當前被@Import註解給標註的全部註解信息
  • 第二個參數表示用於註冊定義一個bean

第二步:編寫代碼,自定義註冊bean

public class Myclass2 implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        //指定bean定義信息(包括bean的類型、做用域...)
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestDemo4.class);
        //註冊一個bean指定bean名字(id)
        beanDefinitionRegistry.registerBeanDefinition("TestDemo4444",rootBeanDefinition);
    }
}
複製代碼

第三步:編寫TestDemo 類,並標註上使用ImportBeanDefinitionRegistrar方式的Myclass2類

@Import({TestDemo2.class,Myclass.class,Myclass2.class})
public class TestDemo {

        @Bean
        public AccountDao2 accountDao222(){
            return new AccountDao2();
        }

}
複製代碼

第四步:運行結果

在這裏插入圖片描述

三、@Import註解的三種使用方式總結

第一種用法:@Import({ 要導入的容器中的組件 } ):容器會自動註冊這個組件,id默認是全類名

 

第二種用法:ImportSelector:返回須要導入的組件的全類名數組,springboot底層用的特別多【重點

 

第三種用法:ImportBeanDefinitionRegistrar:手動註冊bean到容器

以上三種用法方式皆可混合在一個@Import中使用,特別注意第一種和第二種都是以全類名的方式註冊,而第三中可自定義方式。

@Import註解自己在springboot中用的不少,特別是其中的第二種用法ImportSelector方式在springboot中使用的特別多,尤爲要掌握!

若是本文對你有一點點幫助,那麼請點個讚唄,謝謝~

最後,如有不足或者不正之處,歡迎指正批評,感激涕零!若是有疑問歡迎留言,絕對第一時間回覆!

歡迎各位關注個人公衆號,裏面有一些java學習資料和一大波java電子書籍,好比說周志明老師的深刻java虛擬機、java編程思想、核心技術卷、大話設計模式、java併發編程實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一塊兒探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...

在這裏插入圖片描述
相關文章
相關標籤/搜索