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);
        }
    }

      测试结果:

  • 相关阅读:
    网络协议研究的工具-NS3
    指数ETF基金的组合分析方法初探
    小结量化投资之路(2013年写的旧帖再加工)
    金融计算的开源库——QuantLib 学习入门
    如何系统学习网络技术
    学好编程的几个方面
    C++的学习思路(总结以备忘)
    Think in SAS
    springSecurity + OAuth2 获取Token流程分析以及增加协议授权模式
    Redis主从复制、哨兵、Cluster三种模式
  • 原文地址:https://www.cnblogs.com/niujifei/p/15548918.html
Copyright © 2011-2022 走看看