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

一、Import注解

我们先来看一下这个注解的作用:使用@import导入的类都会被加载到ioc容器中

@Import的4种用法

  1. 导入Bean
  2. 导入配置类
  3. 导入ImportSelector实现类,一般用于加载配置文件中的类
  4. 导入ImportBeanDefinitionRegistrar实现类

下面我们来逐一演示

一、导入Bean、导入配置类(这两个很简单就放到一起演示了)

新建一个类叫User

public class User {
}

再建一个User的配置类UserConfig

public class UserConfig {@Beanpublic User getUser(){return new User();}
}

然后我们在引导类中添加一个@Import,导入我们刚刚写的UserConfig

@Import(UserConfig.class)
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);// 根据类型获取相对应的对象User bean = context.getBean(User.class);System.out.println(bean);}
}

这时候启动项目就发现控制台输出了该对象

这时候可能就有人好奇了, Import中明明写的UserConfig, 我们却只获取了User,能不能获取UserConfig这个对象, 结果是可以的

@Import(UserConfig.class)
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);// 根据类型获取相对应的对象User bean = context.getBean(User.class);UserConfig bean1 = context.getBean(UserConfig.class);System.out.println(bean);System.out.println(bean1);}
}

两者都能输出,并且能看到他们的路径, 这是因为被导入的UserConfig里面的方法将User放入了Ioc

所以当我们只用@import导入User.class时,是会显示报错信息的

意思是在容器中没有找到com.zhm.springboot.UserConfig类型的实例

导入UserConfig本质上就是导入配置类, 只是这个类上的@Configuration可以省略

二、导入ImportSelector实现类

我们先来看一下这个接口

定义了一个方法反悔了一个String[], 然后传参是注解元数据

那我们也定义一个类MyImportSelector来实现它,里面放入两个我们自定义的类的路径

public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[]{"com.zhm.springboot.domain.User","com.zhm.springboot.domain.Student"};}
}
@Import(MyImportSelector.class)
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);System.out.println(context.getBean(Student.class));System.out.println(context.getBean(User.class));}
}

启动项目也是成功的打印了

三、导入ImportBeanDefinitionRegistrar实现类

最后一种用法,我们先来看下这个接口

我们也自定义一个类来实现它

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(User.class);AbstractBeanDefinition definition = beanDefinitionBuilder.getBeanDefinition();registry.registerBeanDefinition("user",definition);}
}

引导类中我们进行这样的修改

@Import({MyImportBeanDefinitionRegistrar.class})
@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);System.out.println(context.getBean(User.class));System.out.println(context.getBean("user"));}
}

看下启动项目的打印结果

这样写的好处就是可以自定义ioc中的bean的名称

二、SpringBoot的中使用

介绍完@import之后, 开始今天的重点, 跟踪一下springboot中自动装配的源码

@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);}
}

一切的源头都要从springboot 中的引导类开始说起

引导类中有两个重要的点

  1. run方法(加载流程)
  2. @SpringBootApplication (开启自动装配,包扫描,配置类)

第一点我们先不讲, 重点在@SpringbootApplication身上,我们点进去这个注解

被框出来的注解@EnableAutoConfiguration就是开启自动装配(其他的注解暂时先不介绍),我们继续点进去

被红框框中的就是我们上面一直在介绍的@Import, 可以很明显的看到使用的是第三种方法,导入ImportSelector的实现类,我们点进这个实现类继续看

可以看到它跟我们一样, 重写了selectImports这个方法, 返回的结果是一个String[], 有印象的朋友可能还记得我们@Import注解就是存的一个String[],我们点进红框中的方法继续看

红框中的方法返回就是一个类型为String的list,于是我们继续点进去

可以清晰的看到这边有一个断言, 写的就是 在META-INF/spring.factories中没有找到一条配置, 那也就是说我们的自动装配都放在了 META-INF/spring.factories中, 我们点进上面的loadFactoryNames方法

图中FACTORIES_RESOURCE_LOCATION常量的值正是

我们可以打下断点看下启动看下

图中可以看到总共获取了127条需要自动装配的信息, 那么这些路径从哪来的呢, 上一节讲到过了,就在autoconfigure中的路径

同理可得, 如果我们需要在自己的项目中需要自动装配一些配置, 我们只需要在本项目新建路径META-INF/spring.factories,并在文件中按照这样的写法就可以了

以上就是@import的运用以及springboot自动装配的流程

SpringBoot--自动装配之Import注解以及源码分析相关推荐

  1. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  2. Spring Boot 基于注解驱动源码分析--自动配置

    Spring作为Java开发最常用的容器管理框架,使用注解为我们提供很多便捷,下面通过源码分析Spring基于注解驱动自动配置的原理 首先介绍两个关键类: ConfigurationClassPost ...

  3. Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    http://moshowgame.iteye.com/blog/1607718 @Autowired自动装配 上面的例子我们用的都是手动装配的,如果DAO-Service一多那就很麻烦了,那么我们需 ...

  4. SpringBoot——错误处理机制 定制错误页面 (源码分析)

    目录 一.错误处理机制 二.ErrorPageCustomizer 三.BasicErrorController 四.DefaultErrorViewResolver 五.如何定制错误响应页面 六.D ...

  5. Springboot源码分析第一弹 - 自动装配实现

    Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...

  6. 【SpringBoot】Spring手动装配和SpringBoot自动装配

    文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...

  7. Spring Ioc源码分析 之 Bean的加载(6):属性填充(populateBean())

    "属性填充",也是在populateBean()方法中. 首先回顾下CreateBean的主流程: 如果是单例模式,从factoryBeanInstanceCache 缓存中获取B ...

  8. Apollo 2.0 框架及源码分析(一) | 软硬件框架

    原文地址:https://zhuanlan.zhihu.com/p/33059132 前言 如引言中介绍的,这篇软硬件框架多为现有消息的整合加一些个人的想法.关于 Apollo 介绍的文章已经有许多, ...

  9. SpringBoot自动装配源码解析

    Spring Boot 自动装配原理 使用Spring Boot最方便的一点体验在于我们可以几零配置的搭建一个Spring Web项目,那么他是怎么做到不通过配置来对Bean完成注入的呢.这就要归功于 ...

最新文章

  1. Debian/linux 安装配置ftp服务器
  2. openFeign 服务接口的调用02—— openFeign 的使用步骤
  3. php ole word,介绍 · PHPword新版开发指南 · 看云
  4. Struts2 之 ActionContext获取WEB资源
  5. 单元测试Struts2Spring项目的Action和Service(包含源码)
  6. s5pv210——中断实战
  7. Unreal Engine 4 字符串转换
  8. 键盘向上箭头代码中怎么表示_Altium Designer中的快捷键汇总(收藏必备)
  9. C++之父访谈录:我也没想到 C ++ 会这么成功!
  10. python实现GBDT算法的回归、二分类以及多分类,算法流程解读并可视化
  11. 阻止滑动事件_重温DOM事件流,捕获、冒泡、useCapture、passive
  12. jQuery Deferred对象
  13. 日常中的迅捷PDF转换器
  14. 一个中年SAP自由职业者的2020年终总结
  15. mac 更新系统后无法使用 git
  16. 帝国源码php安装文件是哪个,帝国CMS数据库配置文件是哪个文件?
  17. shell脚本之国际象棋棋盘
  18. MISC互相伤害!!!
  19. Ansible之ansible.cfg
  20. java门禁系统项目开发实现

热门文章

  1. 方正畅听 文字识别自动语音朗读软件
  2. html鼠标感应图片,jQuery实现的感应鼠标悬停图片色彩渐显效果
  3. php checkbox表单提交,HTML表单Checkbox的值如何正确提交到PHP后台?,需要技巧
  4. js时间格式化 YYYY/MM/DD HH:MM:SSS
  5. element-ui下拉框使用value绑定id
  6. element-ui按需引入
  7. java适合年龄_Java实现三人年龄
  8. 使用 JS 实现一个简单的日历
  9. tsv文件导oracle窜列,TSV(tsv文档怎么转换excel)
  10. 【codevs1116】四色问题