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

从SpringBoot源码分析 主程序配置类加载过程_第1张图片

1、@Import(AutoConfigurationPackages.Registrar.class)

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

从SpringBoot源码分析 主程序配置类加载过程_第2张图片

@SpringBootApplication是一个复合注解,其中包括Java元注解(@Target,@Retention,@Documented,@Inherited),不清楚注解的小伙伴可以参考Java注解,其实就这么简单这篇博客学习

@ComponentScan 包扫描组件

@EnableAutoConfiguration,告诉SpringBoot开启自动配置功能,我们之前需要配置的东西,现在都不需要了,SpringBoot 都帮我们做了。

从SpringBoot源码分析 主程序配置类加载过程_第3张图片

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

从SpringBoot源码分析 主程序配置类加载过程_第4张图片

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

从SpringBoot源码分析 主程序配置类加载过程_第5张图片

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

从SpringBoot源码分析 主程序配置类加载过程_第6张图片

从SpringBoot源码分析 主程序配置类加载过程_第7张图片

从SpringBoot源码分析 主程序配置类加载过程_第8张图片

重点@Import(AutoConfigurationPackages.Registrar.class)

上面分析了那么多,可能有的小伙伴们不知道我在干嘛?,其实整个过程主要是实现是将主配置类(@SpringBootApplication)标注的所有包及子包里面的所有组件扫描到Spring容器当中。

也许有初始SpringBoot 的小伙伴们会遇到这样的问题,就是项目启动了,访问页面回出现404,那我下面举例说明一下,你可能就明白了。

细节说明:比如我定义一个UserController类, 但是这个类不在SpringBoot 的主配置的目录下面

项目结构图及实现类

从SpringBoot源码分析 主程序配置类加载过程_第9张图片

@RestController
public class UserController {
    @RequestMapping("/helloTest")
    public String helloTest(){
        return "hello";
    }
}

页面访问:页面显示404

从SpringBoot源码分析 主程序配置类加载过程_第10张图片

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

2、@Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector类,跟踪代码:

从SpringBoot源码分析 主程序配置类加载过程_第11张图片

从SpringBoot源码分析 主程序配置类加载过程_第12张图片

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

从SpringBoot源码分析 主程序配置类加载过程_第13张图片

从SpringBoot源码分析 主程序配置类加载过程_第14张图片

关键功能由@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源码分析 主程序配置类加载过程_第15张图片

你可能感兴趣的:(从SpringBoot源码分析 主程序配置类加载过程)