本文转自@Import注解的作用

1.简介

在平时看源码或者很多配置类上面都会出现@Import注解,功能就是和Spring XML 里面 的 一样. @Import注解是用来导入配置类或者一些需要前置加载的类.通俗的将就是将类放入到IOC容器中。

2.源码解析

2.1 导入配置的三种类型

@Import支持三种方式

  1. 带有@Configuration的配置类(4.2 版本之前只可以导入配置类,4.2版本之后 也可以导入 普通类)
  2. ImportSelector 的实现
  3. ImportBeanDefinitionRegistrar 的实现

2.2 源码解释

/*** Indicates one or more {@link Configuration @Configuration} classes to import.* *功能类似XML 里面的 <import/> ,可以导入 @Configuration配置类,ImportSelector、* ImportBeanDefinitionRegistrar 的实现,4.2 版本之后可以导入普通类(类似AnnotationConfigApplicationContext#register* )* <p>Provides functionality equivalent to the {@code <import/>} element in Spring XML.* Allows for importing {@code @Configuration} classes, {@link ImportSelector} and* {@link ImportBeanDefinitionRegistrar} implementations, as well as regular component* classes (as of 4.2; analogous to {@link AnnotationConfigApplicationContext#register}).** 可以在类级别声明或作为元注释声明* <p>May be declared at the class level or as a meta-annotation.* 如需要引入XML或其他类型的文件,使用@ImportResource注解* <p>If XML or other non-{@code @Configuration} bean definition resources need to be* imported, use the {@link ImportResource @ImportResource} annotation instead.*/@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {/*** {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}* or regular component classes to import.*/Class<?>[] value();}

3、测试例子

3.1 导入普通类

新建一个TestA

public class TestA {public void fun(String str) {System.out.println(str);}public void printName() {System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());}
}

新建一个ImportConfig,在类上面加上@Configuration,加上@Configuration是为了能让Spring 扫描到这个类,并且直接通过@Import引入TestA类。

@Import({TestA.class})
@Configuration
public class ImportConfig {}

TestA 是一个普通的类,现在可以被@Autowired注释然后调用,就直接说明已经被Spring 注入并管理了,普通的类都是需要先实例化。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ApplicationMain.class)
public class ImportAnnotionTest {@AutowiredTestA testA;@Testpublic void TestA() {testA.printName();}
}

结果:

类名 :com.test.importdemo.TestA

3.2 导入带有@Configuration的配置类

新建TestB

@Configuration
public class TestB {public void fun(String str) {System.out.println(str);}public void printName() {System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());}
}

在ImportConfig.class里面直接引入TestB

@Import({TestA.class,TestB.class})
@Configuration
public class ImportConfig {}

TestB.class 的类上面已经有了@Configuration注解,本身就会配spring扫到并实例,@import引入带有@Configuration的配置文件,是需要先实例这个配置文件再进行相关操作

   @AutowiredTestB testB;@Testpublic void TestB(){testB.printName();}

3.3 通过ImportSelector 方式导入的类

新建TestC

public class TestC {public void fun(String str) {System.out.println(str);}public void printName() {System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());}
}

新建SelfImportSelector实现ImportSelector 接口,注入TestC

public class SelfImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {// 返回的是需要注入到容器中的类的全限定类名return new String[]{"com.test.importdemo.TestC"};}
}

ImportConfig上面引入SelfImportSelector.class

@Import({TestA.class,TestB.class,SelfImportSelector.class})
@Configuration
public class ImportConfig {}

测试

    @AutowiredTestC testC;@Testpublic void TestC() {testC.printName();}

testC可以正常的注入,但是SelfImportSelector是无法放入到IOC容器中的。

3.4 通过 ImportBeanDefinitionRegistrar 方式导入的类

新建TestD

public class TestD {public void fun(String str) {System.out.println(str);}public void printName() {System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());}
}

新建SelfImportBeanDefinitionRegistrar.class,实现接口ImportBeanDefinitionRegistrar,注入TestD

public class SelfImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition root = new RootBeanDefinition(TestD.class);registry.registerBeanDefinition("testD", root);}
}

ImportConfig类上加上导入SelfImportBeanDefinitionRegistrar

@Import({TestA.class,TestB.class,SelfImportSelector.class,SelfImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {}

这些方法都可以将类注入到Spring容器中

原理解析

直接参考原文@Import注解的作用

@Import注解的作用相关推荐

  1. Spring中@Import注解的作用和使用

    查看Import注解源码 作用: 1.声明一个bean 2. 导入@Configuration注解的配置类 3.导入ImportSelector的实现类 4.导入ImportBeanDefinitio ...

  2. 五、Spring中的@Import注解

    一.使用@Import注解导入组件 @Import注解的作用是给容器中导入组件,回顾下我们给容器中导入组件的方式,可以通过Spring的xm配置方式,可以通过注解,如@Component等,也可以通过 ...

  3. Spring高级之注解@Import注解、ImportSelector、ImportBeanDefinitionRegistrar详解(超详细)

    定义/作用 @Import注解只能作用在类上,一种使用场景是在spring注解驱动开发环境下与配置类配合使用的,其作用是引用其他配置类.使得我们可以和早起的基于XML配置文件开发那样.使用不同的配置类 ...

  4. @Import注解:导入配置类的四种方式源码解析

    微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...

  5. @import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析

    本文转载自本人技术博客:felord.cn 转载请注明出处 1. 前言 Spring Boot 都会有一个名为 xxApplication 的启动类,里面有一个标准的 java 应用的入口 main ...

  6. 通过@Import注解把类注入容器的四种方式

    文章目录 1. @Import导入的四种方式 2. 准备工作 ①:导入普通类ConfigA ②:导入`@Configuration`配置类ConfigB ③:导入`ImportSelector`的实现 ...

  7. @Import注解使用及源码分析

    1.简介 在阅读spring源码的时候,当读到解析@configuration这个注解的时候,发现其中解析到一个很重要的注解叫做@Import,可能很多人没有听过,没有翻阅源码的时候也是不知所云,其实 ...

  8. SpringBoot--自动装配之Import注解以及源码分析

    上期我们讲解SpringBoot中使用的Conditional注解以及在自动装配中是如何使用的,这期我们来讲一讲,SpringBoot中的Import注解.官方是如何使用的以及自动装配的源码解析. 一 ...

  9. 注解的作用 常用注解

    注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包.类.构造方法.域.方法.参数以及局部变量. 注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包.类.构造方法. ...

  10. Spring中@AliasFor注解的作用及原理

    本文基于Springboot 2.1.6.RELEASE 版本分析. 关于@AliasFor注解,曾提过的一个issue Explicit attribute overrides configured ...

最新文章

  1. centos7搭建svn,并用http访问
  2. 蓝湖怎么切图标注_【蓝湖指北】一张图教你如何选择标注尺寸
  3. 构建高性能J2EE应用的十个技巧
  4. oracle的scn增量备份,【Oracle】基于SCN的增量备份修复DataGuard GAP
  5. SharePoint CAML In Action——Part I
  6. CCF认证训练行动路线图
  7. 红外解码软件 android,一文教会你红外线遥控器软件解码程序
  8. Linux 文件或文件夹重命名命令mv
  9. 洛谷 P5194 [USACO05DEC]Scales S(DFS)
  10. 数据科学家在“新常态”下发生了怎样的转变?
  11. jQuery常用语法笔记
  12. ESXI5.5设置主机的时间自动同步服务 NTP
  13. 机器学习中的numpy的array_Python中机器学习的Numpy指南
  14. cad2019字体_这些是2019年最有效的简历字体
  15. ssm-学子商城-项目第一天
  16. Flash CS4 Professional 10.0.2简体中文版下载地址
  17. 机器人也会骑车?日本村田顽童来京秀车技
  18. 问卷调查试卷的数据设计
  19. 打开计算机网络自动连接,电脑如何自动连接上网 开机自动拨号连接宽带的方法【步骤】...
  20. 国外问卷调查做快点有影响吗

热门文章

  1. iOS 指令集架构Architectures armv6、armv7、armv7s、arm64、arm64e、x86_64、i386
  2. 算法:Longest Valid Parentheses(最长有效的括号)
  3. mysql觸發器_mysql觸發器案例
  4. 圆形体癣是什么样子的图片_这是高手!只用一个「圆形」,也能做出高大上的PPT!...
  5. presto安装及使用 1
  6. ImportError: libgfortran.so.4: cannot open shared object file: No such file or directory
  7. python字典用法总结
  8. 002-用python设计的第一个游戏
  9. c语言语句结束的标准,C语言的语句要求以哪种符号结束?
  10. 现代通信原理4.1:随机变量