• spring注解之@Import注解的三种使用方式


    @

    1、@Import注解须知

    1、@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中

    2、加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,@Import注解可以用于导入第三方包 ,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷


    3、@Import注解有三种用法

    2、@Import的三种用法

    @Import的三种用法主要包括:

    1、直接填class数组方式
    2、ImportSelector方式【重点】
    3、ImportBeanDefinitionRegistrar方式

    2.1、第一种用法:直接填class数组

    直接填对应的class数组,class数组可以有0到多个。

    语法如下:

    @Import({ 类名.class , 类名.class... })
    public class TestDemo {
    
    }

    对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.yc.类名

    2.2、第二种用法:ImportSelector方式【重点】

    这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下:

    创建Myclass类并实现ImportSelector接口

    public class Myclass implements ImportSelector {
    //既然是接口肯定要实现这个接口的方法
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            return new String[0];
        }
    }

    分析实现接口的selectImports方法中的:

    • 1、返回值: 就是我们实际上要导入到容器中的组件全类名【重点 
    • 2、参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】

    需要注意的是selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!

    以上分析完毕之后,具体用法步骤如下:

    第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值

    public class Myclass implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            return new String[]{"com.yc.Test.TestDemo3"};
        }
    }

    第二步:编写TestDemo 类,并标注上使用ImportSelector方式的Myclass类

    @Import({TestDemo2.class,Myclass.class})
    public class TestDemo {
            @Bean
            public AccountDao2 accountDao2(){
                return new AccountDao2();
            }
    
    }

    可以看出,宜春故意挑了个龙套角色@Bean注解,若对@Bean注解不是很清晰的童鞋可以参考大白话讲解Spring的@bean注解

    第三步:编写打印容器中的组件测试类

    /**
     * 打印容器中的组件测试
     */
    public class AnnotationTestDemo {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestDemo.class);  //这里的参数代表要做操作的类
    
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            for (String name : beanDefinitionNames){
                System.out.println(name);
            }
    
        }
    }

    第四步:运行结果
    在这里插入图片描述

    2.3、第三种用法:ImportBeanDefinitionRegistrar方式

    同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册,具体如下:

    第一步:创建Myclass2类并实现ImportBeanDefinitionRegistrar接口

    public class Myclass2 implements ImportBeanDefinitionRegistrar {
    //该实现方法默认为空
        @Override
        public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
          
        }
    }

    参数分析:

    • 第一个参数:annotationMetadata 和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息
    • 第二个参数表示用于注册定义一个bean

    第二步:编写代码,自定义注册bean

    public class Myclass2 implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
            //指定bean定义信息(包括bean的类型、作用域...)
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestDemo4.class);
            //注册一个bean指定bean名字(id)
            beanDefinitionRegistry.registerBeanDefinition("TestDemo4444",rootBeanDefinition);
        }
    }

    第三步:编写TestDemo 类,并标注上使用ImportBeanDefinitionRegistrar方式的Myclass2类

    @Import({TestDemo2.class,Myclass.class,Myclass2.class})
    public class TestDemo {
    
            @Bean
            public AccountDao2 accountDao222(){
                return new AccountDao2();
            }
    
    }

    第四步:运行结果
    在这里插入图片描述

    3、@Import注解的三种使用方式总结

    第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名

    第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 

    第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器

    以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式。

    @Import注解本身在springboot中用的很多,特别是其中的第二种用法ImportSelector方式在springboot中使用的特别多,尤其要掌握!

  • 相关阅读:
    非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法
    AWS 免费套餐
    SQL Server全时区转换
    SQL Server 连接问题案例解析(1)
    SQL Saturday活动再起
    SqlServerProxy的一些资料
    数据是企业的无价財富——爱数备份存储柜server的初体验(图文)
    JEECG第二期深入使用培训(报名截止2014-06-21)
    Java提高篇(三三)-----Map总结
    经常使用哈希函数的比較及其C语言实现
  • 原文地址:https://www.cnblogs.com/zhoading/p/12194960.html
Copyright © 2020-2023  润新知