首页 > 其他分享 >Springboot 启动

Springboot 启动

时间:2023-10-25 18:12:01浏览次数:32  
标签:web Springboot 启动 Spring springframework --- import org

参考:

rhyme  : SPRINGBOOT启动流程及其原理

fhfirehuo: SpringBoot的启动流程

  • Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等;但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
  • Spring MVC提供了一种轻度耦合的方式来开发web应用;它是Spring的一个模块,是一个web框架;通过DispatcherServlet, ModelAndView 和 View Resolver,开发web应用变得很容易;解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
  • Spring Boot实现了auto-configuration自动配置(另外三大神器actuator监控,cli命令行接口,starter依赖),降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具;同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。

在其中比较重要的有三个注解,它们三个可以用一个 @SpringBootApplication 替代:

  1. @SpringBootConfiguration:继承了Configuration,表示当前是注解类
  2. @EnableAutoConfiguration :启用或禁用 Spring Boot 自动配置。
  3. @ComponentScan:扫描路径设置(具体使用待确认)

例如,这两个代码块都会导致类似的行为:

SpringBoot 类,继承自 SpringBootServletInitializer

package com.ztesoft.zsmart.bss.ucc.mmgw;

import com.ztesoft.zsmart.core.log.ZSmartLogger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;


@EnableScheduling
@EnableAsync
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class BootApplication extends SpringBootServletInitializer {

    private static Logger logger = Logger.getLogger(BootApplication.class);
   
    public static void main(String[] args) throws Exception {
        System.out.println("---start---");
        logger.info("---start---");
        try {
            SpringApplication.run(BootApplication.class, args);
        }
        catch (Exception e) {
            e.printStackTrace();
            logger.warn("mmgw start exeception", e);
        }
        System.out.println("---start end---");
        logger.info("---start end---");

    }

}

SpringApplication 构造方法

  public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        this.sources = new LinkedHashSet();
        this.bannerMode = Mode.CONSOLE;
        this.logStartupInfo = true;
        this.addCommandLineProperties = true;
        this.addConversionService = true;
        this.headless = true;
        this.registerShutdownHook = true;
        this.additionalProfiles = new HashSet();
        this.isCustomEnvironment = false;
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
     // 主启动类,放到 Set 里。其实就是一个有 @SpringbootApplication 的启动类 this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
     // 确定项目的启动类型。springboot1.5 只有两种类型web环境和非web环境,springboot2.0 有三种类型
     // NONE:不需要在web容器环境下运行,也就是普通的工程
     // SERVLET:基于Servlet的WEB项目
     // Reactive:响应式Web应用,Spring5版本的新特性 this.webApplicationType = WebApplicationType.deduceFromClasspath();
     // 实例化所有实现了 org.springframework.context.ApplicationContextInitializer 接口的类(主要方法 initialize) this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
     // 实例化所有实现了 org.springframework.context.ApplicationListener 接口的类(主要方法 onApplicationEvent) this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
     // main 函数所在的启动类 this.mainApplicationClass = this.deduceMainApplicationClass(); }

两个值得注意的地方,实例化了所有 ApplicationContextInitialzer 和 ApplicationListener

  • org.springframework.context.ApplicationContextInitializer#initialize 
    • 会在 ConfigurableApplicationContext 的 refresh() 方法调用之前被调用(prepareContext方法中调用),做一些容器的初始化工作。
  • org.springframework.context.ApplicationListener#onApplicationEvent  
    • Springboot整个生命周期在完成一些阶段的时候都会通过事件推送器(EventPublishingRunListener)产生一个事件(ApplicationEvent), 然后再遍历每个监听器(ApplicationListener)以匹配事件对象,这是一种典型的观察者设计模式。

 

标签:web,Springboot,启动,Spring,springframework,---,import,org
From: https://www.cnblogs.com/suBlog/p/17787348.html

相关文章

  • SpringBoot自动配置原理解析
    1:什么是SpringBoot自动配置首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发者快速搭建一套开发环境。SpringBoot能将主流的开发框架(例如SpringMVC,Dubbo,Mybatis,Redis等),做到像Maven导入Jar包一......
  • springboot 06 idea提交到Gitee
         --->commit   首次要填Gitee的账号密码  ......
  • SpringBoot内容协商(Content Negotiation)二 —— 自定义消息转换器(MessageConverter)
    SpringBoot内置的消息转换器SpringBoot没有处理返回yaml格式的数据,这里需要手动添加处理这种返回格式的支持。导入依赖<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId></dependency>添加配......
  • Kubernetes:kube-apiserver 之启动流程(一)
    0.前言前面两篇文章Kubernetes:kube-apiserver之scheme(一)和Kubernetes:kube-apiserver之scheme(二)重点介绍了kube-apiserver中的资源注册表scheme。这里进入正题,开始介绍kube-apiserver的核心实现。1.kube-apiserver启动流程kube-apiserver使用Cobra作为......
  • 【Springboot文件上传】前后端双开,大文件秒传、断点续传的解决方案和优雅实现
    思路和解决方案探讨秒传这里指的“秒传”,是指:当用户选择上传一个文件时,服务端检测该文件之前是否已经被上传过,如果服务器已经存有该文件(完全一样),就立马返回前端“文件已上传成功”。前端随即将进度条更新至100%。这样给用户的感觉就是“秒传”的感觉。对于每一个上传到服务......
  • SpringBoot自动配置原理解析 | 京东物流技术团队
    1:什么是SpringBoot自动配置首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发者快速搭建一套开发环境。SpringBoot能将主流的开发框架(例如SpringMVC,Dubbo,Mybatis,Redis等),做到像Maven导入Jar包一样......
  • springboot解决跨域
    新建config包在建文件复制进去即可importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigura......
  • springboot 整合 gridfs 、webUploader实现大文件分块上传、断点续传、秒传
    主要的pom.xml:<dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>    </dependency><!--mongodb-->    <dependency>      <groupId>org.spri......
  • SpringBoot获取当前操作用户的id/信息
    一、概述在一般性的基设需求中,有需要获取当前用户操作记录的情况,也就是说我们需要记录当前用户的信息。如:id、昵称、账号等信息。这些信息一般用于记录用户的个人行为,例如:用户的操作日志,记录某些数据的更改或者添加者信息等。本例主要用于记录更改及添加者信息(操作......
  • SpringBoot实现对文件的断点续传和秒传
    本文断点续传文件思路:前端(客户端)需要根据固定大小对文件进行分片,请求后端(服务端)时要带上分片序号和大小;服务端创建conf文件用来记录分块位置,conf文件长度为总分片数,每上传一个分块即向conf文件中写入一个127,那么没上传的位置就是默认的0,已上传的就是Byte.MAX_VALUE127(这步是......