zoukankan      html  css  js  c++  java
  • SpringBoot -- 项目结构+启动流程

    一、简述: 项目结构

    二、简述:启动流程

    说springboot的启动流程,当然少不了springboot启动入口类

    1 @SpringBootApplication
    2 public class SpringBootWebApplication {
    3     public static void main(String[] args) {
    4         SpringApplication application = new SpringApplication(SpringBootWebApplication.class);
    5         application.run(args);
    6     }
    7 }

    以上代码很容易看出哪些是关键,当然是:

    1、@SpringBootApplication

    2、application.run()

    分别是springboot 加载配置启动 ,下面详细说明这两块。


    1.SpringBootApplication的背后

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
            @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
    }

    其中,三个是最重要的注解:

    @SpringBootConfiguration    (@SpringBootConfiguration中其实用的也是@Configuration);

    @EnableAutoConfiguration   ;

    @ComponentScan        

    @SpringBootApplication整合了三个注解使用者写起来看起来都比较简洁。

    1.1@Configuration

    它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。

    如下案例说明xml和注解实现bean的定义

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
           default-lazy-init="true">
           <!--bean定义-->
    </beans>

    1.2@EnableAutoConfiguration

    @SuppressWarnings("deprecation")
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(EnableAutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {

    @EnableAutoConfiguration简单的说它的作用就是借助@Import的支持,收集和注册特定场景相关的bean定义。

    其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,

    @EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

    借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持很智能的自动配置:

    clipboard.png

    SpringFactoriesLoader其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。

    将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。(如下页面模版的配置)

    clipboard.png


    1.3springboot启动简单流程

    1.3.1 当我们运行SpringApplication的main方法时,调用静态方法run():

             首先是实例化,SpringApplication初始化的时候主要做主要做三件事:

    • 根据classpath下是否存在(ConfigurableWebApplicationContext)判断是否要启动一个web applicationContext。
    • SpringFactoriesInstances加载classpath下所有可用的ApplicationContextInitializer
    • SpringFactoriesInstances加载classpath下所有可用的ApplicationListener

    clipboard.png

    1.3.2 SpringApplicatio实例化完成并且完成配置后调用run()方法,

             首先遍历初始化过程中加载的SpringApplicationRunListeners,

             然后调用starting(),开始监听springApplication的启动。

    clipboard.png

    1.3.3 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment。

             将配置环境(Environment)加入到监听器对象中(SpringApplicationRunListeners)。

    1.3.4 banner属性的设置

    clipboard.png

    1.3.5 ConfigurableApplicationContext(应用配置上下文)创建,根据webEnvironment是否是web环境创建默认的contextClass,

             AnnotationConfigEmbeddedWebApplicationContext(通过扫描所有注解类来加载bean)和ConfigurableWebApplicationContext),

             最后通过BeanUtils实例化上下文对象,并返回。

    clipboard.png

    1.3.6 prepareContext()方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。

    clipboard.png

    1.3.7 refreshContext(context),bean的实例化完成IoC容器可用的最后一道工序。

    clipboard.png

    1.3.8 最后springboot做一些收尾工作。

    自此springboot的简单流程到此结束。

    结:

    Spring Boot 是基于Spring的一套快速开发整合包,简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。

    Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置),这样我们就可以简单的开始。多数SpringBoot应用只需要很少的Spring配置。

  • 相关阅读:
    vue-cli构建的项目手动添加eslint配置
    给通过canvas生成的二维码添加logo
    webpack打包时候去掉console.log配置
    gist.github.com 被墙无法访问解决办法
    axios.js 在测试机ios7.1的iphone4中不能发送http请求解决方案
    linux 系统的7个运行级别
    今天遇到了不能创建mysql函数
    今天测试大商创,遇到了 upstream sent too big header while reading response header from upstream
    mysql5.7 datetime 默认值为‘0000-00-00 00:00:00'值无法创建问题解决
    IE浏览器中判断IE版本
  • 原文地址:https://www.cnblogs.com/651434092qq/p/12009957.html
Copyright © 2011-2022 走看看