目录
1,@Import 注解须知
2,@Import 的三种用法
3,@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 中使用的特别多, 尤其要掌握!
如果本文对你有一点点帮助, 那么请点个赞呗, 谢谢~
最后, 若有不足或者不正之处, 欢迎指正批评, 感激不尽! 如果有疑问欢迎留言, 绝对第一时间回复!
欢迎各位关注我的公众号, 里面有一些 java 学习资料和一大波 java 电子书籍, 比如说周志明老师的深入 java 虚拟机, java 编程思想, 核心技术卷, 大话设计模式, java 并发编程实战..... 都是 java 的圣经, 不说了快上 Tomcat 车, 咋们走! 最主要的是一起探讨技术, 向往技术, 追求技术, 说好了来了就是盆友喔...
来源: https://www.cnblogs.com/yichunguo/p/12122598.html