[java]一分鍾學會spring注解之@Import注解


一分鍾學會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();
}

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

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容器了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM