原文链接:https://www.jianshu.com/p/e7a33e9eec0e

idea插件--翻译神器:https://blog.csdn.net/lmd1234_/article/details/113482839

1.springBoot简介:

  1.Spring boot 采用约定大于配置的思想对应用程序进行默认配置,减少了大量的配置时间。

2.springBoot 包含如下特性:

  1.创建可以独立运行的 Spring 应用

  2.直接嵌入 Tomcat 或 Jetty 服务器,不需要部署 WAR 文件

  3.提供推荐的基础 POM 文件来简化 Apache Maven 配置

  4.尽可能的根据项目依赖来自动配置 Spring 框架

  5.提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查

  6.没有代码生成,也没有 XML 配置文件

3.springBoot 加载:
  1.主函数类如下:
  

  2.最主要的步骤都通过下面两个完成。

    1.注解 @SpringBootApplication ;

    2.方法 SpringApplication.run()。

    3.其实所有的依赖在这一步就可以完成注入:

      1.spring 读取所有依赖中 META-INF/spring.factories 文件,该文件指明了哪些依赖可以被自动加载

      2.然后根据 ImportSelector 类选择加载哪些依赖,使用 ConditionOn 系列注解排除掉不需要的配置文件;

      3.最后将剩余的配置文件所代表的 bean 加载到 IoC 容器中。

    4.META-INF/spring.factories 文件的读取:

      1.spring 所有的配置文件都分布在 jar 包的 META-INF/spring.factories 中

      2.每一个 META-INF/spring.factories 为一个键值对列表

      

 

      3.在程序中,这段列表会被解析为 Map<K, List<V>> 的格式,即一个 MultiValueMap(一个键对应多个值的 map),键和每一个值都是一个类的权限定名;

      4.取配置文件的操作就发生在 SpringApplication 类的实例化过程中;

      

       5.在 getSpringFactoriesInstances(ApplicationContextInitializer.class)) 中 spring 读取了spring.factories 文件;

       

      6.loadFactoryNames((Class<?> factoryClass, @Nullable ClassLoader classLoader) 这个函数

        1.该函数是 SpringFactoriesLoader 类提供的一个静态方法,用于读取 factoryClass 的类全限定名这个键在 spring-factoies 中的值列表;

        2.loadSpringFactories 读取所有的配置文件中的属性的键值对,并把缓存到一个 cache 中,在需要读取的时候进行读取。

        3.在运行完 loadSpringFactories(classLoader) 执行语句后,在如上的 spring.factories 实例下,cache 可能变成如下形式:

        

 

      7.解析配置文

        1.

       

         1.以指定的 factoryClass 的类全限定名为键,尝试从缓存中取出值

        2.对于 ApplicationContextInitializer.class 这个 factoryClass 来说,会取出所有键为 org.springframework.context.ApplicationContextInitializer 的值;

    3.文件上下文的加载

      1.注解简介:

        1.@SpringBootApplication 是一个复合注解:

        

           1.@SpringBootConfiguration:

            1.有了这个注解,我们就可以把由 @SpringBootApplication 注解修饰的类作为配置类来使用,即在类 DemoApplication 中由 @Bean 注解修饰的代码都会被注入到 IoC 容器中由 Spring 统一管理。

          2.@EnableAutoConfiguration:

            1.

            

               1.@Import注解可以导入三种类:

                1.@Configuration 注解修饰的类

                2.ImportSelectorImportBeanDefinitionRegistrar 的实现类

                  1.定义:

                  

                  2.该接口的主要作用是根据给定的选择条件(通常是一个或多个注解属性)导入哪个 @Configuration 类。

                  3.如果该接口的子类实现了如下四个接口,会先执行如下四个接口的函数:

                    1.EnvironmentAware

                    2.BeanFactoryAware

                    3.BeanClassLoaderAware

                    4.ResourceLoaderAware

                  5.如果希望在所有的 @Configuration 类都导入后再导入该类,则使用其子接口 DeferredImportSelector

                3.普通的组件类,即由 @Component 注解修饰的类。

          3.@ComponentScan

            1.该注解会自动扫描该类所在包,将各种组件注入到 IoC 容器中让其管理

    4.filter:在 spring 中,有过滤器注解

    

 

    5.加载过程:

    SpringApplication 的实例方法 run 方法,在 run 方法中,会创建一个新的上下文实例 context,并调用 contextrefresh 方法,refresh 方法中,会自动配置我们需要的默认上下文;

 

      1.invokeBeanFactoryPostProcessors 会解析 @Import 注解,并根据 @Import 的属性进行下一步操作;

       

 

       2.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors() 的方法;

      

 

       3.invokeBeanDefinitionRegistryPostProcessors 函数对每一个定义类的后置处理器分别进行应用, @Configure 的解析就在这个函数中;

      

 

       4.进入最关键的类 ConfigurationClassPostProcessor,这个类用户来注册所有的 @Configure@Bean。他的 processConfigBeanDefinitions 函数如下:

      

 

       5.在解释候选集 parser.parse(candidates) 中,会调用 sourceClass = doProcessConfigurationClass(configClass, sourceClass) 方法依次解析注解,得到所有的候选集。

      6.解析完成之后,会找到所有以 @PropertySource@ComponentScan@Import@ImportResource@Bean 注解的类及其对象,如果有 DeferredImportSelector,会将其加入到 deferredImportSelectorHandler 中,并调用 this.deferredImportSelectorHandler.process() 对这些 DeferredImportSelector 进行处理。

      7.Spring 会将 AutoConfigurationImportSelector 封装成一个 AutoConfigurationGroup,用于处理。最终会调用 AutoConfigurationGroupprocess 方法

      

 

 

      9.我们可以看到 process 最终调用了我们非常熟悉的函数 SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

        1.该方法以 EnableAutoConfiguration 类为键(org.springframework.boot.autoconfigure.EnableAutoConfiguration),取得所有的值。

        2.还会调用 configurations = filter(configurations, autoConfigurationMetadata) 方法,将不需要的候选集全部排除。(该方法内部使用 AutoConfigurationImportFilter 的实现类排除)。

        3.spring 通过读取所有所需要的 AutoConfiguration,就可以加载默认的上下文容器,实现自动注入。


作者:sschrodinger
链接:https://www.jianshu.com/p/e7a33e9eec0e
 
  5.springBoot核心原理:
  https://blog.csdn.net/Chen_Victor/article/details/81262233
    1.spring ioc

      1.ioc(inversion of control,控制反转)有两种实现方式,一种是di(dependency injection),另一种是dl(dependency lookup,依赖查找),

      前者是当前软件实体被动接受其依赖的其他组件被ioc容器注入,而后者则是当前软件实体主动去某个服务注册地查找其依赖的那么服务。

    

      2.注解 annotation

        1.@configuration
        任何一个标注了@configuration的Java类定义都是一个JavaConfig配置类。

        2.@bean
        任何一个标注了@bean的方法,其返回值将作为一个bean定义注册到spring的ioc容器,方法名将默认成为该bean定义的id。

        3.@ComponentScan
        @ComponentScan用于配合一些元信息Java annotation,比如@component和@repository等,将标注了这些元信息annotation的bean定义类批量采集到spring的ioc容器中。
        我们可以通过basePackages等属性来细粒度地定制@ComponentScan自动扫描的范围,如果不指定,则默认spring框架实现会从声明@ComponentScan所在类的package进行扫描。

        4@PropertySource与@PropertySources
        @PropertySource用于从某些地方加载*.properties文件内容,并将其中的属性加载到ioc容器中,便于填充一些bean定义属性的占位符。

        5.@Import与@ImportResource
        @Import负责引入JavaConfig形式定义的ioc容器配置,如果有一些遗留的配置或者遗留系统需要以xml的形式来配置(比如dubbo框架),我们依然可以通过@ImportResource将它们一起合并到当前JavaConfig配置的容器中。

     2.springBoot

      1.@SpringBootApplication

      

        1.@SpringBootConfiguration和@Configuration

          

        2.@EnableAutoConfiguration

           

 

             

 

            

           3.@ComponentScan

             @ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。

      2.SpringApplication执行流程

        

 

 

 

 

 参考:

《springboot揭秘 快速构建微服务体系》
《spring实战》
spring boot启动流程解析:https://www.cnblogs.com/trgl/p/7353782.html
spring boot启动流程详解:https://www.cnblogs.com/xinzhao/p/5551828.html