今天主要从以下几方面来介绍一下@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容器了


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



更多优质文章请关注以下公众号查阅:


一分钟学会spring注解之@Import注解_注解