Spring Boot超详细分析启动流程

Spring Boot是基于Spring框架的一种快速开发框架,它通过自动化配置和约定大于配置的方式,可以快速的搭建一个Web应用。

Spring Boot启动流程主要分为三个阶段:准备阶段、上下文创建阶段、启动阶段。

准备阶段

Spring Boot准备阶段主要是读取应用程序的配置文件,获取配置文件中自定义的配置内容,并为后续的启动做好一些准备工作。准备阶段分为以下两个过程:

1. 加载基本的Spring Framework设置

在这一步中,Spring Boot会加载基本的Spring Framework设置,并创建并设置AnnotationConfigApplicationContext或者XmlWebApplicationContext的实例对象。

public static void main(String[] args) {
  ApplicationContext ctx = SpringApplication.run(Application.class, args);
}

在Spring Boot应用程序中,我们可以通过调用“SpringApplication.run()”方法来启动应用程序,并返回一个上下文对象,该上下文对象为获取Spring Bean的方式提供了支持。

2. 加载配置文件

Spring Boot默认会使用application.properties或者application.yml作为应用程序的配置文件。在启动时Spring Boot会加载这些配置文件,根据不同的配置文件的前缀来创建一个Environment实例对象,并将其设置到Spring的上下文环境中。

server:
  port: 8080

logging:
  level:
    com:
      example:
        acme: DEBUG

上下文创建阶段

在准备阶段完成后,Spring Boot将进入上下文创建阶段。在这个阶段中,Spring Boot会根据不同的配置来创建和管理Spring上下文。该阶段可以分为以下三个过程:

1. 创建BeanFactory

在创建BeanFactory时,Spring Boot将会实例化一个默认的BeanFactory。并在该BeanFactory中注册一些常用的Bean,比如包扫描机制等。

public static void main(String[] args) {
  new SpringApplicationBuilder(Application.class)
    .web(WebApplicationType.SERVLET)
    .run(args);
}

通过调用SpringApplicationBuilder的run方法创建ApplicationContext实例时,如果我们指定WebApplicationType为SERVLET,那么就会创建一个org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext(ServletContext)对象。如果我们指定WebApplicationType为REACTIVE,那么就会创建一个org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext(ApplicationContext)对象。

2. 加载ApplicationContextInitializers并对ApplicationContext进行初始化

ApplicationContextInitializer是Spring提供的一个扩展点,它可以在ApplicationContext创建之前或之后对ApplicationContext进行一些预处理。Spring Boot中,主要为了满足用户的自定义扩展需求,Spring Boot提供了一些默认的ApplicationContextInitializer实现类,比如设置系统属性、设置环境变量等。

public static void main(String[] args) {
  new SpringApplicationBuilder(Application.class)
    .web(WebApplicationType.SERVLET)
    .initializers(new MyApplicationContextInitializer())
    .run(args);
}

public class MyApplicationContextInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
  @Override
  public void initialize(GenericApplicationContext applicationContext) {
    //自定义初始化逻辑
  }
}

3. 装载应用程序主类

在装载应用程序主类时,Spring Boot会读取应用程序主类中的注解信息,例如:@Configuration、@ComponentScan等,在根据这些注解信息依次依赖注入应用程序中定义的各个Bean,完成程序的部署和配置。

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
   SpringApplication.run(Application.class, args);
  }
}

在这个例子中,通过 @SpringBootApplication注解表示整个项目是一个SpringBoot应用程序,它会自动扫描包下所有@Component或@Configuration注解的类,并把这些类注入应用程序上下文。

启动阶段

在创建ApplicationContext之后,Spring Boot将会进入启动鉴定阶段。主要任务是启动服役服务或者Web容器。

1. 创建Web服务器

如果项目有WebApplicationType.SERVLET或WebApplicationType.REACTIVE的标记,那么就会启动该Web类型对应的Web服务器。

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
   new SpringApplicationBuilder(Application.class)
    .web(WebApplicationType.SERVLET)
    .run(args);
  }
}

2. 启动服务器

启动服务器。

示例1

以下是一个使用Spring Boot启动HTTP服务器的示例代码。

@SpringBootApplication
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}

@RestController
@RequestMapping("/hello")
public class HelloController {
  @GetMapping("/{user}")
  public String hello(@PathVariable("user") String user) {
    return "hello, " + user;
  }
}

示例2

以下是一个使用Spring Boot启动FTP服务器的示例代码。

@SpringBootApplication
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}

@Configuration
@EnableFtpServer
public class FtpServerConfig {
  @Autowired
  private FtpServerProperties ftpServerProperties;

  @Bean
  public FtpServerFactory getFtpServerFactory() {
    FtpServerFactory serverFactory = new FtpServerFactory();
    ListenerFactory listenerFactory = new ListenerFactory();
    listenerFactory.setPort(ftpServerProperties.getPort());
    listenerFactory.setServerAddress(ftpServerProperties.getIpAddress());
    serverFactory.addListener("default", listenerFactory.createListener());
    return serverFactory;
  }
}

以上就是Spring Boot超详细分析启动流程的完整攻略。涵盖了准备阶段、上下文创建阶段和启动阶段的详细解析,并给出了两个具体的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot超详细分析启动流程 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 如何使用Jackson和JSON Pointer查询解析任何JSON节点

    如何使用Jackson和JSON Pointer查询解析任何JSON节点 Jackson是一个Java中处理JSON格式的高效库。除了允许你将一个Java对象序列化转化为JSON格式外,还可以用来读取和解析JSON。本文将详细讲解如何使用Jackson和JSON Pointer查询解析任何JSON节点。 JSON Pointer是一种用于在JSON文档中寻找…

    Java 2023年5月26日
    00
  • JSP使用JDBC连接MYSQL数据库的方法

    下面是JSP使用JDBC连接MYSQL数据库的完整攻略。 准备工作 下载并安装MYSQL数据库。 下载并安装Tomcat服务器。 在Tomcat中配置JDBC驱动程序。将MYSQL的JDBC驱动程序(mysql-connector-java-x.x.xx.jar)放到Tomcat的lib目录下。如果没有该目录,需要手动创建。 JSP连接MYSQL数据库的步骤…

    Java 2023年6月15日
    00
  • 关于Java中方法重载和方法重写

    方法重写是子类继承父类(默认继承Object类)后覆盖父类的方法 需要保证同名 同参 同返回值 且访问权限范围不能缩小(public>protected>default>private) public class Father{ public int method(){ return -1; } } class Son extends Fa…

    Java 2023年4月22日
    00
  • JSP 开发之hibernate配置二级缓存的方法

    下面是详细讲解“JSP 开发之 hibernate 配置二级缓存的方法”的完整攻略。 简介 在使用 Hibernate 进行开发的时候,为了提高系统的性能,常常需要使用二级缓存来优化查询。本文将介绍如何在 Hibernate 中配置二级缓存。 步骤 1. 添加缓存依赖 为了使用 Hibernate 的二级缓存,需要添加相应的缓存依赖。 <!– Hib…

    Java 2023年6月15日
    00
  • Java Stream流之求和的实现

    下面是关于“Java Stream流之求和的实现”的完整攻略: 什么是Java Stream Java Stream 是 Java 8 的新增特性,它提供了一种非常高效、简洁优美的数据处理方式,可以方便地完成各种数据处理操作。 Stream 可以看作是一种 数据流(Stream) ,数据从一个管道(Stream) 中依次经过各种操作进行处理,最终得到目标结果…

    Java 2023年5月26日
    00
  • Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)

    下面我会给出一份详细的攻略,帮助你快速了解如何通过使用Eclipse、Java、Swing和Mysql来实现电影购票系统。 准备工作 安装 JDK 和 Eclipse 下载该电影购票系统所需的Java类库和驱动程序mysql-connector-java-5.1.47-bin.jar,并在Eclipse的项目中添加这些类库 搭建Mysql数据库 设计数据库 …

    Java 2023年5月23日
    00
  • Java面向对象之继承的概念详解

    Java面向对象之继承的概念详解 继承是面向对象编程的三大特性之一,也是Java程序设计中重要的概念之一。继承允许我们在已有类的基础上定义新的类,新的类可以继承父类的属性和方法,同时可以添加自己的属性和方法。 继承的定义和基本语法 继承(inheritance)是OO(面向对象)技术的一个基本概念,它是从已有类中派生出新的类,新的类可以拥有父类的属性和方法,…

    Java 2023年5月26日
    00
  • 搭建简单的Spring-Data JPA项目

    以下是详细讲解“搭建简单的Spring-Data JPA项目”的完整攻略。 一、准备环境 首先你需要安装好下列环境: JDK IDE(比如IntelliJ IDEA、Eclipse等) Maven(或Gradle) 二、创建项目 1.使用IDE新建Maven项目 使用IDE(以IntelliJ IDEA为例)创建一个Maven项目,并添加以下依赖项: &lt…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部