zoukankan      html  css  js  c++  java
  • [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容器了

  • 相关阅读:
    设计模式 学习笔记(8) 适配器模式、单例模式、享元模式
    设计模式 学习笔记(7) 抽象工厂模式、状态模式
    判断页面是否被嵌入iframe里面
    css3的transform:tanslateZ没有效果
    vuecli3多页应用配置与优化
    正则的test和exec方法与字符串的search,replace,match,split方法的使用
    实验 1:Mininet 源码安装和可视化拓扑工具
    2020软件工程第一次作业
    R12新功能
    FSG(1) FSG报表组件
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/14650743.html
Copyright © 2011-2022 走看看