@
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中使用的特別多,尤其要掌握!