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


@

1、@Import注解須知

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

 

 

2、加入IOC容器的方式有很多種,@Import注解就相對很牛皮了,@Import注解可以用於導入第三方包 ,當然@Bean注解也可以,但是@Import注解快速導入的方式更加便捷

 


3、@Import注解有三種用法

 

2、@Import的三種用法

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

1、直接填class數組方式
2、ImportSelector方式【重點】
3、ImportBeanDefinitionRegistrar方式

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

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

語法如下:

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

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

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

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

創建Myclass類並實現ImportSelector接口

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

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

  • 1、返回值: 就是我們實際上要導入到容器中的組件全類名【重點 
  • 2、參數: 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.3、第三種用法: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(); } }

第四步:運行結果
在這里插入圖片描述

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

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

 

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

 

 

 

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

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

@Import注解本身在springboot中用的很多,特別是其中的第二種用法ImportSelector方式在springboot中使用的特別多,尤其要掌握!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM