从SpringBoot源码分析 主程序配置类加载过程

1、@Import(AutoConfigurationPackages.Registrar.class)
初始SpringBoot 我们知道在SpringBoot 启动类上有一个@SpringBootApplication注解,配置类的加载就是从这里开始(源头),一起走起。

@SpringBootApplication是一个复合注解,其中包括Java元注解(@Target,@Retention,@Documented,@Inherited),不清楚注解的小伙伴可以参考Java注解,其实就这么简单这篇博客学习
@ComponentScan 包扫描组件
@EnableAutoConfiguration,告诉SpringBoot开启自动配置功能,我们之前需要配置的东西,现在都不需要了,SpringBoot 都帮我们做了。

接下来我们主要将一下@EnableAutoConfiguration这个注解中@AutoConfigurationPackage是自动配置包

在@AutoConfigurationPackage包里有@Import(AutoConfigurationPackages.Registrar.class)的注解,@Import是Spring的底层注解,表示给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class决定。

在AutoConfigurationPackages下面的registerBeanDefinitions 方法,获取主配置类下所有包及子包的组件导入到Spring 容器当中。



重点@Import(AutoConfigurationPackages.Registrar.class)
上面分析了那么多,可能有的小伙伴们不知道我在干嘛?,其实整个过程主要是实现是将主配置类(@SpringBootApplication)标注的所有包及子包里面的所有组件扫描到Spring容器当中。
也许有初始SpringBoot 的小伙伴们会遇到这样的问题,就是项目启动了,访问页面回出现404,那我下面举例说明一下,你可能就明白了。
细节说明:比如我定义一个UserController类, 但是这个类不在SpringBoot 的主配置的目录下面
项目结构图及实现类

@RestController
public class UserController {
@RequestMapping("/helloTest")
public String helloTest(){
return "hello";
}
}
页面访问:页面显示404

所以综合我们前面提到了,在使用SpringBoot 开发项目的时候,创建类的时候需要在(@SpringBootApplication)标注的所有包及子包里面创建,这样是SpringBoot 就能把所有的组件加入到Spring容器当中。
2、@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector类,跟踪代码:


从源码中可以看出SpringBoot 在启动的时候从类路径下的 META-INF/spring.factores 中获取EnableAutoConfiguration指定的值,将这些作为自动配置类导入到容器当中,自动配置类就生效,帮我们进行自动配置的工作。



关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件.

3、小结
(1)、 @Import(AutoConfigurationPackages.Registrar.class),实现是将主配置类(@SpringBootApplication)标注的所有包及子包里面的所有组件扫描到Spring容器当中。
(2)、 @Import(AutoConfigurationImportSelector.class),实现的是SpringBoot 在启动的时候从类路径下的 META-INF/spring.factores 中获取EnableAutoConfiguration指定的值,将这些作为自动配置类导入到容器当中,自动配置类就生效,帮我们进行自动配置的工作。
由于本人能力有限,若文章有错误的地方,请大家指出,一起交流学习。今天就和大家讲到这里,喜欢我的小伙伴们,动动你的小手点个关注呗。
欢迎大家关注我的公众号:阿福聊编程,长期更新Java各种技术文章。

从SpringBoot源码分析 主程序配置类加载过程的更多相关文章
- 从SpringBoot源码分析 配置文件的加载原理和优先级
本文从SpringBoot源码分析 配置文件的加载原理和配置文件的优先级 跟入源码之前,先提一个问题: SpringBoot 既可以加载指定目录下的配置文件获取配置项,也可以通过启动参数( ...
- SpringBoot源码分析之SpringBoot的启动过程
SpringBoot源码分析之SpringBoot的启动过程 发表于 2017-04-30 | 分类于 springboot | 0 Comments | 阅读次数 SpringB ...
- Springboot源码分析之项目结构
Springboot源码分析之项目结构 摘要: 无论是从IDEA还是其他的SDS开发工具亦或是https://start.spring.io/ 进行解压,我们都会得到同样的一个pom.xml文件 4. ...
- Spring Ioc源码分析系列--Bean实例化过程(二)
Spring Ioc源码分析系列--Bean实例化过程(二) 前言 上篇文章Spring Ioc源码分析系列--Bean实例化过程(一)简单分析了getBean()方法,还记得分析了什么吗?不记得了才 ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Spring源码分析之`BeanFactoryPostProcessor`调用过程
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...
- Spring Ioc源码分析系列--Bean实例化过程(一)
Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...
- Springboot源码分析之jar探秘
摘要: 利用IDEA等工具打包会出现springboot-0.0.1-SNAPSHOT.jar,springboot-0.0.1-SNAPSHOT.jar.original,前面说过它们之间的关系了, ...
- ------ Tor(洋葱路由器)匿名网络源码分析——主程序入口点(一)------
--------------------------------------------------------<概览> tor 的源码包可以从官网下载,可能需要预先利用其它FQ软件才能访 ...
随机推荐
- struts2入门教学
我的博客地址:https://blog.csdn.net/qq_41907991 首先介绍一下struts2使用的基本步骤: 1.导入相关的 jar 文件 2.需要在 web.xml 文件中配置一个 ...
- ubuntu18.04下mysql安装时没有出现密码提示
前言: 一:配置 ubuntu 18.04 mysql 5.7.30 二:问题 ubuntu18.04下mysql安装时没有出现密码提示,安装后自己有一个默认的用户名以及密码 解决方案: 1. 在终端 ...
- spark on yarn安装
网上关于spark的安装说明很多了,这里就以spark pre-build with user provided hadoop 安装包为例讲解, 下载spark pre-build with us ...
- docker安装之后的配置各种坑
1.docker官网下载安装之后 2.点击 Docker quick start快捷方式 错误提示: windows正在查找bash.exe,也可以手动查找,但是一直找不到. 3.执行 docker- ...
- 洛谷P1027题解
https://www.luogu.org/problem/P1027传送到题目 首先,让我骂一句那没事找事的Car还取一个那么奇怪的名字看到这个题,恕我直言,我们明显可以看出这是一道图的最短路问题. ...
- PAT 1009 Product of Polynomials (25分) 指数做数组下标,系数做值
题目 This time, you are supposed to find A×B where A and B are two polynomials. Input Specification: E ...
- windows下node配置npm全局路径(踩坑)
事情的起因是:Koa要求v7.6.0以上的nodejs. 但是window环境下升级node不容易,试过npm install -g n 和n stable等命令无效,而网上推荐的nvm并不支持win ...
- wepy+vant-weapp踩坑记
最近用了几个月的wepy框架,碰到了挺多问题,这里总结一下 1.clone的代码无法再本地运行,wepy报错 解决方案: 执行命令 : `npm install wepy-cli@1.6.1-alph ...
- 汇编语言 简单的Hello World
DATA SEGMENT STRING DB 'Hello World!','$' DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV ...
- 3.10 Go Map哈希表
3.10 Go Map哈希表 map是key-value类型数据结构,读作(哈希表.字典),是一堆未排序的键值对集合. map是引用类型,使用make函数或者初始化表达式创建. map的key必须是支 ...