zoukankan      html  css  js  c++  java
  • 从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类,跟踪代码:

    image-20200524204538302

    从源码中可以看出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各种技术文章。

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/13040836.html
Copyright © 2011-2022 走看看