• 5、spring注解学习(组件注册)——@Import快速给容器中导入组件


    一、@Import方式一:直接导入

      1、创建两个类测试

     2、在spring全局配置类中进行配置(@Import可导一个和多个组件,导入后组件的id为全类名

    //配置类==配置文件
    @Configuration        //告诉Spring这是一个配置类
    @Import({Color.class,Animal.class})        //@Import    【快速给容器中导入组件】
    public class MainConfig {
    
    }

      3、测试

        @Test
        public void test01() {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
            //getBeanDefinitionNames获取容器中组件的name(即配置文件中组件的id)
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            for (String name : beanDefinitionNames) {
                System.out.println(name);
            }
        }

    结果:

     说明注入成功,另外用@Import导入的组件默认id时全类名

    二、@Import方式二:利用ImportSelector 自定义逻辑导入组件

      1、再创建两个类

       2、创建自定义导入选择器(实现ImportSelector接口)  

    //自定义逻辑返回需要导入的组件
    public class MyImportSelector implements ImportSelector {
        
        //返回值,就是要导入到容器中的组件的全类名数组
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            //....中间进行逻辑选择
            
            //不要返回null,不然会报空指针异常,值必须为全类名
            return new String[]{"com.atguigu.bean.Red","com.atguigu.bean.Yellow"};
        }
    
    }

      3、修改spring配置类

    @Configuration        //告诉Spring这是配置类
    @Import({Color.class,Animal.class,MyImportSelector.class})        //@Import    【快速给容器中导入组件】
    public class MainConfig {
    
    }

    导入自定义导入选择器后再再在运行方法中测试结果:

    三、@Import方式三:ImportBeanDefinitionRegistrar 手动注册bean到容器中

      1、再创建一个类

       2、自定义实现BeanDefinitionRegistrar接口的类(判断如果容器中有Id为com.atguigu.bean.Animal的组件,则注册cat组件)

    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        
        /**
         * AnnotationMetadata:当前类的注解信息
         * BeanDefinitionRegistry:BeanDefinition注册类:
         *             把要添加到容器中的bean,调用BeanDefinitionRegistry.registerBeanDefinition手动注册进来
         */
        @Override
        public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
            //简单逻辑判断
            //判断是否有这个组件,注意containsBeanDefinition这个方法是根据组件id查询
            boolean definition = beanDefinitionRegistry.containsBeanDefinition("com.atguigu.bean.Animal");
            //有上面这个组件则...
            if(definition) {
                //注册组件进入容器,可自己指定组件名
                RootBeanDefinition beanDefinition = new RootBeanDefinition(Cat.class);
                beanDefinitionRegistry.registerBeanDefinition("cat", beanDefinition);
            }
        }
    
    }

      3、修改spring配置类

    //配置类==配置文件
    @Configuration        //告诉Spring这是配置类
    @Import({Color.class,Animal.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})        //@Import    【快速给容器中导入组件】
    public class MainConfig {
    
    }

      再次运行测试方法结果为(因为我们有Id为com.atguigu.bean.Animal的组件,所以cat组件也能创建成功)

  • 相关阅读:
    [置顶] 大型网站技术架构(六)网站的伸缩性架构
    [置顶] 大型网站技术架构(五)网站高可用架构
    [置顶] 大型网站技术架构(五)网站高可用架构
    [置顶] 大型网站技术架构(四)网站的高性能架构
    [置顶] 大型网站技术架构(四)网站的高性能架构
    [置顶] 大型网站技术架构(三)架构核心要素
    [置顶] 大型网站技术架构(二)架构模式
    [置顶] 大型网站技术架构(二)架构模式
    [置顶] 大型网站技术架构(一)大型网站架构演化
    [置顶] 大型网站技术架构(一)大型网站架构演化
  • 原文地址:https://www.cnblogs.com/lyh233/p/12438728.html
Copyright © 2020-2023  润新知