zoukankan      html  css  js  c++  java
  • 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中使用的特别多,尤其要掌握!

    如果本文对你有一点点帮助,那么请点个赞呗,谢谢~

  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/lm970585581/p/13066139.html
Copyright © 2011-2022 走看看