• (一)IOC 容器:【6】@Import 系列—给容器中快速导入组件


    注解

        给容器中注册方式:
        1) 通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
        2)@Bean 导入第三方包里面的组件
        3)@Import:快速给容器中导入一个组件
           【1】@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;
           【2】ImportSelector:返回需要导入的 组件的全类名数组;
           【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中
    

      

    一、注册组件

      给容器中注册组件有以下几种方式:

      (1)通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】

      (2)@Bean (适用于导入第三方包里面的组件)

      (3)@Import:快速给容器中导入一个组件

    二、@Import 注解快速导入

      在配置类上面使用 @Import 注解可以快速给容器中导入组件:

    @Import(value = {Color.class, Red.class})  //快速导入多个组件
    @Configuration
    public class MainConfig4 {
    
        @Bean(name = "person")
        public Person person01() {
            return new Person("李四", 20);
        }
    }

      注意

        (1)配置类只能有一个 @Import 注解,不能出现多个;

        (2)导入的组件的 id 默认是组件的全类名

    三、@ImportSelector

      ImportSelect 是一个接口,里面提供了一个方法 selectImports,用于返回要导入的组件的全类名数组。

      自定义一个 MyImportSelect 类,实现 ImportSelect 接口
    //自定义逻辑返回需要导入的组件
    public class MyImportSelector implements ImportSelector {
    
        /**
         * 返回值,就是要导入到容器中组件全类名
         * AnnotationMetadata:当前标注 @Import 注解的类的所有注解信息
         * @param importingClassMetadata
         * @return
         */
        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    
            //方法不要返回 null 值,可以返回空数组
            return new String[]{"com.njf.bean.Yellow", "com.njf.bean.Blue"};
        }
    }

      在配置类上进行应用:

    @Import(value = {Color.class, Red.class, MyImportSelector.class})
    @Configuration
    public class MainConfig4 {
    
        @Bean(name = "person")
        public Person person01() {
            return new Person("李四", 20);
        }
    }

      

    四、@ImportBeanDefinitionRegistrar

      ImportBeanDefinitionRegistrar 是一个接口,它里面有一个registerBeanDefinition方法,用于向容器中注册一个组件。

      自定义一个MyImportBeanDefinitionRegistrar 类:

    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
        /**
         * AnnotationMetadata:当前类的注解信息
         * BeanDefinitionRegistry:Bean定义的注册类
         *   把所有需要添加到容器中的 bean,调用registerBeanDefinition方法进行手工注册
         *   BeanDefinitionRegistry.registerBeanDefinition
         */
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            boolean definition1 =  registry.containsBeanDefinition("com.njf.bean.Red");
            boolean definition2 =  registry.containsBeanDefinition("com.njf.bean.Blue");
            if (definition1 && definition2) {
    
                //beanDefinition  指定bean的类型,bean的定义信息,如类型,scope等信息
                RootBeanDefinition beanDefinition = new  RootBeanDefinition(RainBow.class);
                //注册一个bean,指定bean的名字
                registry.registerBeanDefinition("rainBow",  beanDefinition);
            }
        }
    }

      在配置类上应用:

    @Import(value = {Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
    @Configuration
    public class MainConfig4 {
    
        @Bean(name = "person")
        public Person person01() {
            return new Person("李四", 20);
        }
    }

      测试结果:

  • 相关阅读:
    【JAVA Swing】自定义弹出的无边提醒框(可自动消失)
    java比较器Comparator的简单使用
    BoneCP的简单使用
    鸿蒙的js开发部模式18:鸿蒙的文件上传到python服务器端
    【知识点前情提要】鸿蒙小白入门指南!跟着张荣超老师学鸿蒙
    分布式流转开发常见报错FAQ
    Ability之间或者进程间数据传递之对象(Sequenceable序列化)
    【资源下载】安卓VS鸿蒙第三方件切换宝典 V1.0
    鸿蒙开源第三方组件 ——B站开源弹幕库引擎的迁移(上)
    鸿蒙的js开发部模式17:鸿蒙的系统能力的应用模块
  • 原文地址:https://www.cnblogs.com/niujifei/p/15548918.html
Copyright © 2020-2023  润新知