spring注解之@Import注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014677702/article/details/86685802

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注解如下:

扫描二维码关注公众号,回复: 5114508 查看本文章
@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容器了

猜你喜欢

转载自blog.csdn.net/u014677702/article/details/86685802