精华内容
下载资源
问答
  • SpringBoot的启动流程

    2020-08-26 13:48:57
    SpringBoot的启动流程 SpringBoot的启动流程

    SpringBoot的启动流程

    SpringBoot的启动流程

    展开全文
  • springboot的启动流程

    2019-10-28 18:14:49
    springboot的启动流程分下面几步走: 1.初始化 2.获取监听器并启动监听器 3.构造容器环境 4.创建容器 5.实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误 6.准备容器 7.刷新容器 8.刷新容器后置...

    SpringBoot的启动过程可以分为三步,第一步是初始化启动类SpringApplication,第二步是准备工作,第三步是自动装配工作。

    一.总结
    springboot的启动流程分下面几步走:
    1.初始化
    2.获取监听器并启动监听器
    3.构造容器环境
    4.创建容器
    5.实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误
    6.准备容器
    7.刷新容器
    8.刷新容器后置处理

    1.初始化的过程
    A.根据加载器中是否包含了某些特定的类来判断容器类型,在创建容器和容器环境的时候就会被用到。
    B.初始化监听器,利用SpringFactoriesLoader读取依赖jar下面的所有META-INF/spring.factories文件,获取SpringApplicationRunListener对应的监听器全限定名称,并利用反射初始化。
    C.初始化ApplicationContextInitializer对应的Initializer对象。
    D.找到main方法所在的类,寻找启动类

    2.获取监听器并启动监听器
    A.获取META-INF/spring.factories文件中SpringApplicationRunListener对应的所有监听器,初始化它们或得一个监听器集合,将这个集合负值给SpringApplicationRunListeners,SpringApplicationRunListeners相当于是一个监听器的广播器,要发布什么事件都是先由SpringApplicationRunListeners来发布,然后再遍历所有的监听器发布事件。
    B.监听器开始监听,这里会创建一个线程池,通过异步的方式来发送事件。

    3.构造容器环境
    A.根据容器类型来创建不同容器环境对象。
    B.加载系统变量和环境变量。
    C.监听器发布环境准备事件,这个里面有一个很重要的监听器ConfigFileApplicationListener,来加载项目的配置文件。

    4.创建容器
    A.根据初始化时获取到的容器类型来获取对应的容器。当容器类型是SERVLET的时候,获取到的是AnnotationConfigServletWebServerApplicationContext容器

    5.实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误,在try ,cachez中,启动报错的时候,异常会被cach捕获,所以SpringBootExceptionReporter在cache中起作用的。

    6.准备容器
    A.设置容器环境,将创建好的容器环境赋值给容器
    B.执行容器中的ApplicationContextInitializer
    C.向各监听器发送容器准备好了的事件
    D.向容器中注册容器启动参数
    E.将启动类注册到容器中
    F.发布容器已加载事件

    7.刷新容器
    A.刷新上下文环境,初始化上下文环境,对系统的环境变量或者系统属性进行准备和校验
    B.初始化BeanFactory,解析XML,和填充准备BeanFactory
    C.开始自动自动装配,通过@ComponentScan读取启动类所在包和子包下带有@Component注解的类,并注入到容器中,解析@Import注解,通过SelectImport读取spring.factories里面的配置类并注入到容器中。
    C.实例化所有剩余的(non-lazy-init) 单例Bean.
    这篇文章比较详细的刷新容器所做的事情,但是排版比较差,以后有时间整理一下
    https://bbs.csdn.net/topics/392397556?page=1#post-409544506

    public ConfigurableApplicationContext run(String... args) {
    		//时间监控
    		StopWatch stopWatch = new StopWatch();
    		stopWatch.start();
    		ConfigurableApplicationContext context = null;
    		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
    		//java.awt.headless是J2SE的一种模式用于在缺少显示屏、键盘或者鼠标时的系统配置,很多监控工具如jconsole 需要将该值设置为true,系统变量默认为true
    		configureHeadlessProperty();
    		//获取spring.factories中的监听器变量,args为指定的参数数组,默认为当前类SpringApplication
    		//第一步:获取并启动监听器
    		SpringApplicationRunListeners listeners = getRunListeners(args);
    		listeners.starting();
    		try {
    			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
    					args);
    			//第二步:构造容器环境
    			ConfigurableEnvironment environment = prepareEnvironment(listeners,
    					applicationArguments);
    			//设置需要忽略的bean
    			configureIgnoreBeanInfo(environment);
    			//打印banner
    			Banner printedBanner = printBanner(environment);
    			//第三步:创建容器
    			context = createApplicationContext();
    			//第四步:实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误
    			exceptionReporters = getSpringFactoriesInstances(
    					SpringBootExceptionReporter.class,
    					new Class[] { ConfigurableApplicationContext.class }, context);
    			//第五步:准备容器
    			prepareContext(context, environment, listeners, applicationArguments,
    					printedBanner);
    			//第六步:刷新容器
    			refreshContext(context);
    			//第七步:刷新容器后的扩展接口
    			afterRefresh(context, applicationArguments);
    			stopWatch.stop();
    			if (this.logStartupInfo) {
    				new StartupInfoLogger(this.mainApplicationClass)
    						.logStarted(getApplicationLog(), stopWatch);
    			}
    			listeners.started(context);
    			callRunners(context, applicationArguments);
    		}
    		catch (Throwable ex) {
    			handleRunFailure(context, ex, exceptionReporters, listeners);
    			throw new IllegalStateException(ex);
    		}
    
    		try {
    			listeners.running(context);
    		}
    		catch (Throwable ex) {
    			handleRunFailure(context, ex, exceptionReporters, null);
    			throw new IllegalStateException(ex);
    		}
    		return context;
    	}
    


    写的比较好的文章:

    https://blog.csdn.net/qq_32117641/article/details/108325293

    ps:要开始准备找工作了,北京的天气也越来越冷。

    展开全文
  • Springboot的启动流程

    2019-08-14 07:18:36
    本文以调试一个实际的SpringBoot启动程序为例...上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行SpringApplication初始化模块,配置一些基本环境变量、资源、构造器、监听器,第...

    具体请参考博客:https://www.cnblogs.com/trgl/p/7353782.html。。。。。
    在这里插入图片描述
    本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。

    总览:
    上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,

    • 第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器;
    • 第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块;
    • 第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。
    展开全文
  • springboot 的启动流程

    2019-10-07 15:21:55
    1.我们springboot 项目的启动类如下。 方式1 @SpringBootApplicationpublic class SpringbootZkLockApplication { public static void main(String[] args) { SpringApplication.run(SpringbootZkLockApplicatio.....

    1.我们springboot 项目的启动类如下。

    方式1

    @SpringBootApplication
    public class SpringbootZkLockApplication {
    public static void main(String[] args) {
    SpringApplication.run(SpringbootZkLockApplication.class, args);
    }
    }
    点击 run 方法源码进入如下,
    /**
    * Static helper that can be used to run a {@link SpringApplication} from the
    * specified source using default settings.
    * @param primarySource the primary source to load
    * @param args the application arguments (usually passed from a Java main method)
    * @return the running {@link ApplicationContext}
    */
    public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
    return run(new Class<?>[] { primarySource }, args);
    }
    继续 点击 run 方法进入源码,
    /**
    * Static helper that can be used to run a {@link SpringApplication} from the
    * specified sources using default settings and user supplied arguments.
    * @param primarySources the primary sources to load
    * @param args the application arguments (usually passed from a Java main method)
    * @return the running {@link ApplicationContext}
    */
    public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    return new SpringApplication(primarySources).run(args);
    }
    我们看到 run() 方法的返回值为 ConfigurableApplicationContext。
    看到这里我们就知道了SpringBoot 启动类的底层 是 new SpringApplication(primarySources).run(args);
    这时候我们的启动类可以可以换成 如下方式启动。
    方式2
    @SpringBootApplication
    public class SpringbootZkLockApplication {

    public static void main(String[] args) {
    //SpringApplication.run(SpringbootZkLockApplication.class, args);
    new SpringApplication(SpringbootZkLockApplication.class).run(args);
    }
    new SpringApplication(SpringbootZkLockApplication.class).run(args); 可以拆分为2个部分启动
    方式3
    @SpringBootApplication
    public class SpringbootZkLockApplication {

    public static void main(String[] args) {
    //SpringApplication.run(SpringbootZkLockApplication.class, args);
    SpringApplication application = new SpringApplication(SpringbootZkLockApplication.class);
    application.run(args);
    }
    }
    上面这三种启动方式都是等价的,都可以启动 SpringBoot 项目。只不过是第一种方式是我们常用的,经过SpringBoot 封装过的启动方式。 
    @EnableAutoConfiguration 注解 加载了我们第三方配置的信息进行 Tomcat 启动。
    DispatcherServletAutoConfiguration ---》ServletWebServerFactoryAutoConfiguration  创建 tomcat。

    转载于:https://www.cnblogs.com/ming-blogs/p/11596870.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,545
精华内容 618
关键字:

springboot的启动流程

spring 订阅