@[toc]javascript
一、@Import只能用在類上 ,@Import經過快速導入的方式實現把實例加入spring的IOC容器中java
二、加入IOC容器的方式有不少種,@Import註解就相對很牛皮了,@Import註解能夠用於導入第三方包 ,固然@Bean註解也能夠,可是@Import註解快速導入的方式更加便捷spring
三、@Import註解有三種用法
@Import的三種用法主要包括:編程
一、直接填class數組方式 二、ImportSelector方式【重點】 三、ImportBeanDefinitionRegistrar方式設計模式
直接填對應的class數組,class數組能夠有0到多個。 數組
語法以下:springboot
@Import({ 類名.class , 類名.class... })
public class TestDemo {
}
複製代碼
對應的import的bean都將加入到spring容器中,這些在容器中bean名稱是該類的全類名 ,好比com.yc.類名併發
這種方式的前提就是一個類要實現ImportSelector接口,假如我要用這種方法,目標對象是Myclass這個類,分析具體以下:app
建立Myclass類並實現ImportSelector接口ide
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車,咋們走!最主要的是一塊兒探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...