下面我会详细地讲解分析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的核心类。它将负责整个应用的启动和管理。具体过程如下:
-
通过SpringApplication的静态工厂方法创建SpringApplication实例;
-
调用SpringApplication实例的run方法;
-
通过SpringApplication实例的run方法,创建一个Spring容器;
-
将所有Spring容器需要的bean加载到容器中;
-
注册所有的 SpringBoot Autoconfiguration;
-
启动 Spring Boot 应用程序的内嵌 Web 服务器;
-
停止 Spring Boot 应用程序的内嵌 Web 服务器;
-
销毁 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技术站