zoukankan      html  css  js  c++  java
  • (一)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);
        }
    }

      测试结果:

  • 相关阅读:
    Ubuntu下编译3.0.4内核
    多个Android项目源码-覆盖方方面面值得学习
    8086汇编指令速查手册
    xz解压缩详解
    (转载)移植最新内核linux-3.14.6到mini2440开发板
    收录 Uboot 详解
    Windows Terminal 配置文件
    C# 7.2 中 In参数( in parameter )的性能比较
    JavaScript 的 parseInt(x), parseFloat(x), Number(x), +x, ~~x, x>>>0, isNaN(x) 区别和结果
    Windows Terminal 配置 git-bash,集成右键菜单,集成VSCode
  • 原文地址:https://www.cnblogs.com/niujifei/p/15548918.html
Copyright © 2011-2022 走看看