分析SpringBoot的启动原理

下面我会详细地讲解分析Spring Boot启动原理的攻略,内容如下。

什么是Spring Boot

Spring Boot 是一个基于Spring Framework构建的用于快速构建Web应用程序和微服务的开源框架。 Spring Boot的主要目的是简化Spring的配置和开发过程。Spring Boot集成了Spring框架,内嵌了Tomcat、Jetty等Web容器,可以通过maven或gradle进行构建。

Spring Boot启动原理

Spring Boot的启动原理主要由两个部分组成:SpringBootServletInitializer和SpringApplication。

SpringBootServletInitializer是SpringBoot提供的一个类,可以通过继承这个类,实现Web应用容器的访问和应用的启动、初始化和销毁等操作。

SpringApplication是SpringBoot的核心类。它将负责整个应用的启动和管理。具体过程如下:

  1. 通过SpringApplication的静态工厂方法创建SpringApplication实例;

  2. 调用SpringApplication实例的run方法;

  3. 通过SpringApplication实例的run方法,创建一个Spring容器;

  4. 将所有Spring容器需要的bean加载到容器中;

  5. 注册所有的 SpringBoot Autoconfiguration;

  6. 启动 Spring Boot 应用程序的内嵌 Web 服务器;

  7. 停止 Spring Boot 应用程序的内嵌 Web 服务器;

  8. 销毁 Spring 容器和应用程序。

SpringBoot启动示例

示例一

编写一个简单的SpringBoot应用程序,如下所示:

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

@SpringBootApplication表示这个是一个Spring Boot应用程序。main方法里面调用了SpringApplication.run方法,传入应用程序入口类,以及系统传入的参数。

执行这个程序后,会看到以下输出:

INFO 5112 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using Java 1.8.0_231 on xiaoxiaodemac.local with PID 5112 (/Users/xiaoxiao/IdeaProjects/demo/target/classes started by xiaoxiao in /Users/xiaoxiao/IdeaProjects/demo)
INFO 5112 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
INFO 5112 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@15af5f9e: startup date [Fri Nov 20 11:00:58 CST 2020]; root of context hierarchy
INFO 5112 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'dispatcherServletRegistration' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$DispatcherServletRegistrationConfiguration; factoryMethodName=dispatcherServletRegistration; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedTomcat.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$DispatcherServletRegistrationConfiguration; factoryMethodName=dispatcherServletRegistration; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedJetty.class]]
INFO 5112 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 1.546 seconds (JVM running for 2.334)

可以看到,Spring Boot启动了一个应用程序,创建了一个AnnotationConfigApplicationContext对象,加载了所有需要的bean,并启动了内嵌的Web服务器。

示例二

下面,我们来看看SpringBoot是如何在Web容器中运行的。在这个示例中,我们将使用SpringBoot自带的Jetty容器。

首先,我们需要在pom.xml文件中添加Jetty的依赖,如下所示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

然后,我们创建一个带有@RestController注解的类,如下所示:

@RestController
public class IndexController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

最后,我们需要创建一个Spring Boot启动类,并将应用程序配置为使用Jetty容器。代码如下所示:

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

    @Bean
    public JettyServletWebServerFactory jettyServletWebServerFactory() {
        JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
        factory.setPort(8080);
        return factory;
    }
}

通过@Bean注解创建JettyServletWebServerFactory对象,并设置端口为8080。运行应用程序后,访问http://localhost:8080/hello,可以看到浏览器输出了"Hello World!"。

总结

Spring Boot启动原理主要由两个部分组成:SpringBootServletInitializer和SpringApplication。SpringBootServletInitializer可以通过继承这个类,实现Web应用容器的访问和应用的启动、初始化和销毁等操作;SpringApplication是SpringBoot的核心类,将负责整个应用的启动和管理。为了更好的理解Spring Boot启动原理,我们还给出了两个示例来演示Spring Boot的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:分析SpringBoot的启动原理 - Python技术站

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

相关文章

  • 亲测有效解决Tomcat启动提示错误:At least one JAR was scanned for TLDs yet contained no TLDs

    首先,这个错误信息提示我们Tomcat扫描到了至少一个JAR文件,但是该JAR文件中没有包含任何的TLD文件。在这种情况下,Tomcat就无法识别出该JAR文件中的标签库,最终导致启动失败。 下面是解决这个问题的攻略步骤: 对于直接使用Tomcat的用户 可以在启动Tomcat之前,在Tomcat根目录下的conf目录找到Catalina/localhost…

    Java 2023年6月2日
    00
  • 小程序登录/注册页面设计的实现代码

    下面我将为你详细讲解小程序登录/注册页面设计的实现代码,包含完整的攻略和示例说明。 第一步:创建登录/注册页面 登录/注册页面是小程序中非常重要的页面,需要设计合理、美观。可以使用 wx.navigateTo API 跳转到登录/注册页面,以下是页面代码示例: <!– pages/login-register/login-register.wxml …

    Java 2023年5月23日
    00
  • 图片路径中含有中文在jsp下不能正常显示的原因及解决

    当图片路径中含有中文字符时,若在jsp页面中直接引用该路径,可能导致图片无法正常显示。这是因为URL是英文字符编码的,中文字符在URL中必须进行编码,如果不编码,就出现了上述问题。 为了解决这个问题,我们可以采取以下两种方法: 1. 对中文字符进行编码 使用URLEncoder对包含中文字符的字符串进行编码,然后将编码后的字符串作为图片路径。示例代码如下: …

    Java 2023年6月15日
    00
  • Java 线程池全面总结与详解

    Java 线程池是一种常用的多线程管理方式。它通过预先创建一组线程池,可以在执行任务时复用这些线程,从而减少线程创建和销毁所带来的开销,提高并发性能。下面是Java线程池的完整攻略: 一、Java 线程池的基本概念 线程池的核心思想是将任务和线程分离,将任务提交给线程池处理。在Java中,可以使用 java.util.concurrent 包下的 Threa…

    Java 2023年5月18日
    00
  • java实现日期拆分的方法

    下面是“Java实现日期拆分的方法”的完整攻略: 1. 前言 在Java中,我们经常需要对日期进行拆分,比如提取年份、月份、日等信息。本文将介绍几种常用的Java实现日期拆分的方法。 2. 通过SimpleDateFormat拆分日期 Java中的SimpleDateFormat类提供了很多格式化日期、解析日期的方法,可以使用它来实现日期的拆分。我们可以将日…

    Java 2023年5月20日
    00
  • JSP在Linux下的安装

    以下是JSP在Linux下的安装攻略,基于Ubuntu 18.04系统,其他Linux系统可能存在细微差异。 安装Java 前往Oracle官网下载Java SE Development Kit(JDK),下载地址为:https://www.oracle.com/java/technologies/javase-downloads.html 下载完成后,将下…

    Java 2023年6月15日
    00
  • Java基础类学习之String详解

    Java基础类学习之String详解 1. 什么是String String是Java语言中常用的引用类型,代表一个字符串对象。在Java程序中,我们可以通过创建String对象的方式或者直接赋值的方式来定义一个String类型的变量。 // 创建String对象 String str1 = new String("Hello World&quot…

    Java 2023年5月26日
    00
  • 使用AngularJS来实现HTML页面嵌套的方法

    使用AngularJS来实现HTML页面嵌套是AngularJS的基本用法之一。下面是实现过程的完整攻略。 环境配置 首先需要准备好配置AngularJS的环境。可以通过以下步骤在本地搭建环境: 下载并安装nodejs环境; 利用npm命令安装angularjs,命令为:npm install angular; 嵌套HTML页面 1. 创建HTML页面 首先…

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