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

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

@Import註解是什麼
@Import的三種使用方式

1,@Import註解是什麼
通過導入的方式實現把實例加入springIOC容器中
2,@Import的三種使用方式
通過查看@Import源碼可以發現@Import註解只能註解在類上,以及唯一的參數value上可以配置3種類型的值Configuration,ImportSelector,ImportBeanDefinitionRegistrar,源碼如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    /**
     * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
     * or regular component classes to import.
     */
    Class<?>[] value();
}

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

  • 基於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 {
    public static void main(String[] args) {
        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名稱爲===org.springboot.demo.annotest.Square
bean名稱爲===org.springboot.demo.annotest.Circular

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

  • 基於自定義ImportSelector的使用
    定義一個MyImportSelector如下:
/**
 * 定義一個我自己的ImportSelector
 */
public class MyImportSelector implements ImportSelector {
    /**
     * Select and return the names of which class(es) should be imported based on
     * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
     *
     * @param importingClassMetadata
     */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.test.Triangle"};
    }
    
}

在定義一個三角形對象

package com.test.Triangle;
/**
 * 定義一個三角形
 *
 * @author zhangqh
 * @date 2018年5月1日
 */
public class 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容器中了

  • 基於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容器了

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