目錄javascript
@java
一、@Import只能用在類上 ,@Import經過快速導入的方式實現把實例加入spring的IOC容器中
spring
二、加入IOC容器的方式有不少種,@Import註解就相對很牛皮了,@Import註解能夠用於導入第三方包 ,固然@Bean註解也能夠,可是@Import註解快速導入的方式更加便捷
編程
三、@Import註解有三種用法
@Import的三種用法主要包括:設計模式
一、直接填class數組方式
二、ImportSelector方式【重點】
三、ImportBeanDefinitionRegistrar方式數組
直接填對應的class數組,class數組能夠有0到多個。 springboot
語法以下:併發
@Import({ 類名.class , 類名.class... }) public class TestDemo { }
對應的import的bean都將加入到spring容器中,這些在容器中bean名稱是該類的全類名 ,好比com.yc.類名app
這種方式的前提就是一個類要實現ImportSelector接口,假如我要用這種方法,目標對象是Myclass這個類,分析具體以下:ide
建立Myclass類並實現ImportSelector接口
public class Myclass implements ImportSelector { //既然是接口確定要實現這個接口的方法 @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[0]; } }
分析實現接口的selectImports方法中的:
須要注意的是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); } } }
第四步:運行結果
一樣是一個接口,相似於第二種ImportSelector用法,類似度80%,只不過這種用法比較自定義化註冊,具體以下:
第一步:建立Myclass2類並實現ImportBeanDefinitionRegistrar接口
public class Myclass2 implements ImportBeanDefinitionRegistrar { //該實現方法默認爲空 @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { } }
參數分析:
第二步:編寫代碼,自定義註冊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
({ 要導入的容器中的組件 } ):容器會自動註冊這個組件,id默認是全類名
第二種用法:
ImportSelector
:返回須要導入的組件的全類名數組,springboot底層用的特別多【重點 】
第三種用法:
ImportBeanDefinitionRegistrar
:手動註冊bean到容器
以上三種用法方式皆可混合在一個@Import中使用,特別注意第一種和第二種都是以全類名的方式註冊,而第三中可自定義方式。
@Import註解自己在springboot中用的不少,特別是其中的第二種用法ImportSelector方式在springboot中使用的特別多,尤爲要掌握!
若是本文對你有一點點幫助,那麼請點個讚唄,謝謝~
最後,如有不足或者不正之處,歡迎指正批評,感激涕零!若是有疑問歡迎留言,絕對第一時間回覆!
歡迎各位關注個人公衆號,裏面有一些java學習資料和一大波java電子書籍,好比說周志明老師的深刻java虛擬機、java編程思想、核心技術卷、大話設計模式、java併發編程實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一塊兒探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...