分析SpringBoot的启动原理

yizhihongxing

下面我会详细地讲解分析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日

相关文章

  • MyBatis下SQL注入攻击的3种方式

    以下是MyBatis下SQL注入攻击的3种方式。 1.参数拼接 如下面的语句: @Select("SELECT * FROM user WHERE username = ‘" + username + "’ AND password = ‘" + password + "’") 其中 usernam…

    Java 2023年5月20日
    00
  • JSP自定义标签入门学习

    JSP自定义标签(JSP Custom Tag)是JSP技术的一个非常重要的组成部分,它可以大大提高JSP页面的可复用性和可维护性。本文将介绍如何入门学习JSP自定义标签。 1. 了解JSP自定义标签 JSP自定义标签是一种可重用的JSP组件,类似于HTML中的自定义标签,可以在JSP页面中定义自己的标签并使用它们。JSP自定义标签可以大大简化JSP页面的编…

    Java 2023年6月15日
    00
  • 关于Spring中声明式事务的使用详解

    关于Spring中声明式事务的使用详解 什么是声明式事务? 在Spring中,事务是指一组需要保证数据完整性和一致性的数据库操作。 在进行事务处理时,必须保证多个操作的原子性,即所有操作都能够全部成功或全部失败。 Spring中的声明式事务是基于AOP实现的,通过对方法进行拦截,在方法执行前后加上事务的开始和结束语句,来实现事务的管理。这样即使开发人员忘记在…

    Java 2023年5月19日
    00
  • Java中Builder模式的实现详解

    Java中Builder模式的实现详解 什么是Builder模式 Builder模式是一种创建型设计模式,它可以让你分步骤地创建复杂对象。与工厂模式不同,Builder模式并不是通过单一的方法来创建对象,而是通过多个方法来设置不同的属性,最终创建出一个想要的对象实例。 Builder模式的优点 Builder模式相对于其他创建对象的方式,有如下的优点: 代码…

    Java 2023年5月26日
    00
  • Java批量转换文件编码格式的实现方法及实例代码

    下面是详细的攻略: 1. 什么是文件编码格式 文件编码格式是指文本文件中字符的编码方式,它决定了计算机如何读取和处理该文本文件。常见的文件编码格式有UTF-8、GBK、GB2312等。 2. 批量转换文件编码格式的步骤 Java实现批量转换文件编码格式的主要步骤如下: 获取需要转换编码格式的文件夹路径 遍历该文件夹中所有文本文件 读取文本文件内容并转换编码格…

    Java 2023年5月20日
    00
  • 【SSM】一、了解Sping 框架

    〇、Maven 0.1 什么是Maven? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build…

    Java 2023年4月25日
    00
  • JAVA字符串拼接常见方法汇总

    JAVA字符串拼接常见方法汇总 为什么需要字符串拼接 在编程过程中,我们经常需要将字符串拼接成一个完整的字符串。字符串拼接是将多个字符串连接形成一个新的字符串的过程,通常使用加号(+)或StringBuilder类来实现。 字符串拼接方式一:使用加号(+)连接字符串 使用加号连接字符串是最基本的字符串拼接方法,它的语法格式如下: String str1 = …

    Java 2023年5月26日
    00
  • Java实现对象按照其属性排序的两种方法示例

    Java是一种高级编程语言,它具有面向对象编程的特点。当我们使用Java进行编程时,很多时候需要对对象进行排序操作。本文将详细讲解如何在Java中实现对象按照其属性排序的两种方法。 方法一:使用Comparator接口 Comparator接口是Java中的一个接口,它可以用于比较对象的属性,从而实现排序功能。使用Comparator接口可以按照任何属性进行…

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