一分鐘學會spring註解之@Import註解

今天主要從以下幾方面來介紹一下@Import註解

  • @Import註解是什麼

  • @Import的三種使用方式


1,@Import註解是什麼


通過導入的方式實現把實例加入springIOC容器中


2,@Import的三種使用方式


通過查看@Import源碼可以發現@Import註解只能註解在類上,以及唯一的參數value上可以配置3種類型的值Configuration,ImportSelectorImportBeanDefinitionRegistrar,源碼如下:


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
   /**
    * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
    * or regular component classes to import.
    */

   Class<?>[] value();
}


接下來就分別來看看三種方式具體使用:


a,基於Configuration也就是直接填對應的class數組


在bean目錄下新增兩個類Square和Circular如下:


/**
* 定義一個圓形
*
* @author zhangqh
* @date 2018年5月1日
*/

public class Circular {
}


/**
* 定義一個正方形
*
* @author zhangqh
* @date 2018年5月1日
*/

public class Square {
}


MainConfig註解配置中增加@Import註解如下:


@Import({Square.class,Circular.class})
@Configuration
public class MainConfig


測試打印如下:


AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanNames = applicationContext2.getBeanDefinitionNames();
for(int i=0;i<beanNames.length;i++){
   System.out.println("bean名稱爲==="+beanNames[i]);
}


運行結果:


bean名稱爲===mainConfig
bean名稱爲===com.zhang.bean.Square
bean名稱爲===com.zhang.bean.Circular


對應的import的bean都已經加入到spring容器中了


b,基於自定義ImportSelector的使用


定義一個MyImportSelector如下:


/**
* 定義一個我自己的ImportSelector
*
* @author zhangqh
* @date 2018年5月1日
*/

public class MyImportSelector implements  ImportSelector{
   public String[] selectImports(AnnotationMetadata importingClassMetadata) {
       return new String[]{"com.zhang.bean.Triangle"};
   }
}


MainConfig註解配置修改如下:


@Import({Square.class,Circular.class,MyImportSelector.class})


測試結果如下:


bean名稱爲===mainConfig
bean名稱爲===com.zhang.bean.Square
bean名稱爲===com.zhang.bean.Circular
bean名稱爲===com.zhang.bean.Triangle


三角形 實例同樣加入到spring容器中了


c,基於ImportBeanDefinitionRegistrar的使用


新建一個ImportBeanDefinitionRegistrar如下:


/**
* 定義一個自定的ImportBeanDefinitionRegistrar
*
* @author zhangqh
* @date 2018年5月1日
*/

public class MyImportBeanDefinitionRegistrar  implements ImportBeanDefinitionRegistrar{
   public void registerBeanDefinitions(
           AnnotationMetadata importingClassMetadata,
           BeanDefinitionRegistry registry)
{
       // new一個RootBeanDefinition
       RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Rectangle.class);
       // 註冊一個名字叫rectangle的bean
       registry.registerBeanDefinition("rectangle", rootBeanDefinition);
   }
}


修改MainConfig註解配置如下:


@Import({Square.class,Circular.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})


運行結果如下:


bean名稱爲===mainConfig
bean名稱爲===com.zhang.bean.Square
bean名稱爲===com.zhang.bean.Circular
bean名稱爲===com.zhang.bean.Triangle
bean名稱爲===rectangle


rectangle打印出來了說明我們通過ImportBeanDefinitionRegistrar註冊的實例也成功加入到了spring容器了


以上是今天文章的所有內容,歡迎大家吐槽



更多優質文章請關注以下公衆號查閱:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章