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整合了三个注解使用者写起来看起来都比较简洁。

[email protected]

它就是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>

[email protected]

@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的支持很智能的自动配置:

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

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


1.3springboot启动简单流程

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

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

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

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

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

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

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

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

1.3.4 banner属性的设置

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

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

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

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

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

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

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

结:

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

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

原文地址:https://www.cnblogs.com/651434092qq/p/12009957.html

时间: 2024-10-08 10:55:44

SpringBoot -- 项目结构+启动流程的相关文章

SpringBoot项目结构介绍

一项目结构介绍 springboot框架本身对项目结构并没有特别的要求,但是按照最佳的项目结构可以帮助我们减少可能遇到的错误问题.结构如下: (1)应用主类SpringbootApplication应该放于根目录下springboot下,通常我们会在主类中做一些框架配置 扫描等配置,SpringbootApplication放在根目录下可以可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容. (2)实体(entity)与数据库访问层(Repository)位于domain包下. (

springboot项目突然启动缓慢

在项目快到最后的时候,有一次在本地启动项目的时候,突然发现项目启动起来特别的慢. 刚开始也不知道哪里出了问题,只能慢慢的查原因. springboot项目在debug模式下本来运行的挺快,后来某一天突然启动一半就卡在那一点一点龟速前进,还以为是我电脑问题,或者我写的代码问题,后来在网上搜了一下,结合自身项目情况,原来是断点问题, 有个断点无论如何都去不掉.可能是之前遗留的,后代码删除了, 也可能是因为这个地方的代码属于加载运行的什么节点,总之去不掉 后来根据网上的方法,在debug模式窗口下,选

SpringBoot项目的创建流程(初步)

小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做JavaEE开发的小伙伴们肯定也听说过"约定大于配置"这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置,可是使用Spring或者SpringMVC的话依然有许多这样的东西需要我们进行配置,这样不仅徒增工作量而且在跨平台部署时容易出问题.OK,由于这些已经存在的问题,Spring Boot应运而生,使用Spring Boot可以让我们快速创建一个基于Spring的项目,而让这个

springboot项目,启动项目后启动的定时器,定时执行任务

package com.wiscom.ism.webapi.ismController; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; impo

SpringBoot源码分析之---SpringBoot项目启动类SpringApplication浅析

源码版本说明 本文源码采用版本为SpringBoot 2.1.0BUILD,对应的SpringFramework 5.1.0.RC1 注意:本文只是从整体上梳理流程,不做具体深入分析 SpringBoot入口类 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args

使用 lntelliJ IDEA 创建 Maven 工程的springboot项目

IntelliJ IDEA 为后起之秀 得到了越来 广泛 应用.下面的idea软件的界面详情 二.使用 IntelliJ IDEA Maven 工程步骤如下: 2.1 依次选择“file”.“new"."project",创建新项目.出现下面的界面,创建项目时选择 Mave ,但 不必选择项目骨架 直接单击 Next 按钮即可 2.2.输入组织名称.模块名称.项 版本号等信息 2.3.选择项目位置,然后单击 Finish 按钮, 完成项目创建 三 三.springboot项目

SpringBoot项目部署到服务器上,tomcat不启动该项目

今天lz把项目重新传到服务器上后,重启tomcat遇到个问题,就是这个tomcat怎么都不启动这个项目,别的项目都没事,一番查找后发现问题所在. 我们先建个SpringBoot工程,重现一下问题: 写了一个简单的controller便于访问测试 可以看到是可以访问到的,接下下我们删除 ServletInitializer 类. 现在的项目结构变成这样: 重新运行一下工程,然后可以看到还是可以访问到的. 然后我们将删掉ServletInitializer 类的项目上传到服务器,看下tomcat启动

SpringBoot启动流程分析(四):IoC容器的初始化过程

SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一):SpringApplication类初始化过程 SpringBoot启动流程分析(二):SpringApplication的run方法 SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法 SpringBoot启动流程分析(四

SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一):SpringApplication类初始化过程 SpringBoot启动流程分析(二):SpringApplication的run方法 SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法 SpringBoot启动流程分析(四