@Import注解的作用
本文转自@Import注解的作用
1.简介
在平时看源码或者很多配置类上面都会出现@Import注解,功能就是和Spring XML 里面 的 一样. @Import注解是用来导入配置类或者一些需要前置加载的类.通俗的将就是将类放入到IOC容器中。
2.源码解析
2.1 导入配置的三种类型
@Import支持三种方式
- 带有@Configuration的配置类(4.2 版本之前只可以导入配置类,4.2版本之后 也可以导入 普通类)
- ImportSelector 的实现
- 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注解的作用相关推荐
- Spring中@Import注解的作用和使用
查看Import注解源码 作用: 1.声明一个bean 2. 导入@Configuration注解的配置类 3.导入ImportSelector的实现类 4.导入ImportBeanDefinitio ...
- 五、Spring中的@Import注解
一.使用@Import注解导入组件 @Import注解的作用是给容器中导入组件,回顾下我们给容器中导入组件的方式,可以通过Spring的xm配置方式,可以通过注解,如@Component等,也可以通过 ...
- Spring高级之注解@Import注解、ImportSelector、ImportBeanDefinitionRegistrar详解(超详细)
定义/作用 @Import注解只能作用在类上,一种使用场景是在spring注解驱动开发环境下与配置类配合使用的,其作用是引用其他配置类.使得我们可以和早起的基于XML配置文件开发那样.使用不同的配置类 ...
- @Import注解:导入配置类的四种方式源码解析
微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...
- @import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析
本文转载自本人技术博客:felord.cn 转载请注明出处 1. 前言 Spring Boot 都会有一个名为 xxApplication 的启动类,里面有一个标准的 java 应用的入口 main ...
- 通过@Import注解把类注入容器的四种方式
文章目录 1. @Import导入的四种方式 2. 准备工作 ①:导入普通类ConfigA ②:导入`@Configuration`配置类ConfigB ③:导入`ImportSelector`的实现 ...
- @Import注解使用及源码分析
1.简介 在阅读spring源码的时候,当读到解析@configuration这个注解的时候,发现其中解析到一个很重要的注解叫做@Import,可能很多人没有听过,没有翻阅源码的时候也是不知所云,其实 ...
- SpringBoot--自动装配之Import注解以及源码分析
上期我们讲解SpringBoot中使用的Conditional注解以及在自动装配中是如何使用的,这期我们来讲一讲,SpringBoot中的Import注解.官方是如何使用的以及自动装配的源码解析. 一 ...
- 注解的作用 常用注解
注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包.类.构造方法.域.方法.参数以及局部变量. 注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包.类.构造方法. ...
- Spring中@AliasFor注解的作用及原理
本文基于Springboot 2.1.6.RELEASE 版本分析. 关于@AliasFor注解,曾提过的一个issue Explicit attribute overrides configured ...
最新文章
- centos7搭建svn,并用http访问
- 蓝湖怎么切图标注_【蓝湖指北】一张图教你如何选择标注尺寸
- 构建高性能J2EE应用的十个技巧
- oracle的scn增量备份,【Oracle】基于SCN的增量备份修复DataGuard GAP
- SharePoint CAML In Action——Part I
- CCF认证训练行动路线图
- 红外解码软件 android,一文教会你红外线遥控器软件解码程序
- Linux 文件或文件夹重命名命令mv
- 洛谷 P5194 [USACO05DEC]Scales S(DFS)
- 数据科学家在“新常态”下发生了怎样的转变?
- jQuery常用语法笔记
- ESXI5.5设置主机的时间自动同步服务 NTP
- 机器学习中的numpy的array_Python中机器学习的Numpy指南
- cad2019字体_这些是2019年最有效的简历字体
- ssm-学子商城-项目第一天
- Flash CS4 Professional 10.0.2简体中文版下载地址
- 机器人也会骑车?日本村田顽童来京秀车技
- 问卷调查试卷的数据设计
- 打开计算机网络自动连接,电脑如何自动连接上网 开机自动拨号连接宽带的方法【步骤】...
- 国外问卷调查做快点有影响吗
热门文章
- iOS 指令集架构Architectures armv6、armv7、armv7s、arm64、arm64e、x86_64、i386
- 算法:Longest Valid Parentheses(最长有效的括号)
- mysql觸發器_mysql觸發器案例
- 圆形体癣是什么样子的图片_这是高手!只用一个「圆形」,也能做出高大上的PPT!...
- presto安装及使用 1
- ImportError: libgfortran.so.4: cannot open shared object file: No such file or directory
- python字典用法总结
- 002-用python设计的第一个游戏
- c语言语句结束的标准,C语言的语句要求以哪种符号结束?
- 现代通信原理4.1:随机变量