在这里我们首先要知道的就是什么是springboot,在使用springboot创建我们自己的项目,的时候我们就需要明白springboot的原理是什么,不然的话我们即使知道如何使用但是根本就无法理解,
目录
二.如何使用Spring Boot 创建一个简单的项目进行CRUD操作
一.什么是SpringBoot
Spring Boot是一个用于开发Java应用程序的开源框架。它构建在Spring框架之上,旨在简化和加快应用程序的开发过程。Spring Boot通过提供默认配置和自动化配置来减少开发人员的配置工作量,并提供了一组强大的功能和工具,使开发者能够快速搭建独立运行的、生产级别的应用程序。
1.为什么需要使用Spring Boot
大家都知道我们在使用和学习SSM的时候最为繁琐的就是我们需要配置很多的配置文件和依赖,俗称配置地狱。在配置的过程中我们还会出现很多的bug,这些bug就是因为我们在导入很多的依赖的同时没有固定的一个规定版本所以就很容易出现jar包冲突,在jar包很多的时候就很难排查,而springboot就帮我们节约了很多的配置的环节。只需要按照 “约定优化配置” 即可。
2.Spring Boot的特点
-
简化配置: Spring Boot使用约定大于配置的原则,通过自动化配置和默认值来减少繁琐的配置步骤。
-
内嵌服务器: Spring Boot内置了常用的服务器(如Tomcat、Jetty等),可以将应用程序打包成可执行的JAR文件并直接运行,无需额外安装Web服务器。
-
自动化依赖管理: Spring Boot通过依赖管理工具(如Maven、Gradle)自动解决依赖关系,并提供了大量的starter依赖,简化了项目的配置和构建。
-
提供监控和管理端点: Spring Boot提供了许多用于监控和管理应用程序的端点(如/health、/metrics、/info等),方便开发者进行应用程序的健康检查和性能监控。
3.Spring Boot的核心功能
1、 可独立运行的Spring项目:Spring Boot可以通过启动类直接运行不要添加去其他的外部框架
2、 内嵌的Servlet容器:Spring Boot有自己的内嵌Tomcat、Jetty或者Undertow,无须以war包形式部署项目。
3、 简化的Maven配置:我们通过Spring Boot的快速构建工具可以直接引入我们需要的依赖。
4、 自动配置Spring:Spring Boot会根据项目依赖来自动配置Spring 框架,极大地减少项目要使用的配置。
5、 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。
6、 无xml配置:完全不需要任何xml配置即可实现Spring的所有配置。
二.如何使用Spring Boot 创建一个简单的项目进行CRUD操作
剩下的就和我们使用SSM创建项目无疑,但是最重要的就是我们需要的yml配置
我们需要启动的话只需要打开我们启动类就可以了,我们创建的所有的文件的时候都必须要存放在启动类下面,不然找不到的话就需要我们手动配置
最后进行一个整体的结构分析
三.Spring Boot的原理分析
-
自动配置(Auto-configuration):Spring Boot通过条件化配置(Conditional Configuration)和自动扫描机制(Classpath Scanning)来自动配置应用程序所需的各种组件和功能。它根据应用程序的类路径和依赖关系,自动检测并配置相应的Beans、数据库连接、消息队列等。
-
起步依赖(Starter Dependencies):Spring Boot提供了一组预定义的起步依赖,这些起步依赖包含了常用的库和框架,例如Web开发、数据访问、安全认证等。通过引入适当的起步依赖,开发者无需手动配置和管理这些库的版本和依赖关系,减少了应用程序的配置复杂度。
-
嵌入式容器(Embedded Container):Spring Boot内置了多个嵌入式容器,如Tomcat、Jetty等,使得应用程序可以独立运行,无需外部容器的支持。开发者只需要将应用程序打包成可执行的JAR文件,即可通过命令行或脚本直接启动。
-
健康检查(Health Check):Spring Boot提供了健康检查的功能,可以通过HTTP端点暴露应用程序的健康状态。开发者可以借助这些健康检查端点,实时监控应用程序的运行状况,并进行故障排查和告警处理。
-
自定义配置(Custom Configuration):除了自动配置外,Spring Boot还提供了强大的配置机制,支持多种配置方式,如属性文件、环境变量、命令行参数等。开发者可以根据需要灵活地定制和扩展应用程序的配置。
四.Spring Boot的执行步骤
-
应用程序入口:Spring Boot应用程序的入口点是一个带有
main
方法的Java类。在该类中,通过调用SpringApplication.run()
方法来启动应用程序。 -
环境准备:Spring Boot会根据配置文件(如
application.properties
或application.yml
)和命令行参数来加载应用程序的配置,并创建一个ApplicationContext
容器。 -
自动配置:Spring Boot根据约定和自动配置机制,自动初始化和配置各种组件和功能,如数据库连接、Web服务器、安全认证等。这些自动配置是基于类路径上的依赖关系和条件判断进行的。
-
Bean加载:Spring Boot会扫描应用程序中的Bean定义(注解或XML配置),并将它们注册到
ApplicationContext
容器中。开发者也可以通过自定义配置类来手动注册额外的Bean。 -
启动嵌入式容器:如果应用程序使用了Web相关的功能,Spring Boot会根据配置选择适当的嵌入式Web容器(如Tomcat或Jetty),并启动它。嵌入式容器负责处理HTTP请求和响应,使得应用程序可以独立运行。
-
请求处理:一旦嵌入式容器启动,它会监听指定的端口,并接收和处理传入的HTTP请求。Spring Boot会根据请求的URL路径和HTTP方法,将请求路由到相应的控制器(Controller)处理方法上。
-
控制器处理:控制器处理方法接收到请求后,根据业务逻辑进行处理,并生成响应数据。可以通过注解来定义请求映射、参数绑定、数据验证等。
-
响应返回:控制器处理方法执行完成后,会返回一个包含响应数据的对象或视图。Spring Boot会将响应数据转换为合适的格式(如JSON、HTML等),并返回给客户端。
-
应用程序关闭:当应用程序收到关闭信号(如CTRL+C)或应用程序停止命令时,Spring Boot会优雅地关闭嵌入式容器和释放资源。
五.Spring Boot的源码分析
相信很多人尝试读过Spring Boot
的源码,但是始终没有找到合适的方法。那是因为你对Spring Boot
的各个组件、机制不是很了解,研究起来就像大海捞针。
这就是具体的源码分析运行的具体步骤:
其实我们都知道我们运行springboot项都是通过带有@SpringBootApplication注解开始的我们就以这个注解开始分析
我们点击进入就会发现里面就是通过这些注解来的
@Target({ElementType.TYPE})
:指定了该注解可以应用在类(Type)上。@Retention(RetentionPolicy.RUNTIME)
:指定了该注解的生命周期为运行时(Runtime),即在运行时可以通过反射获取到该注解的信息。@Documented
:指定该注解需要包含在Java文档中。@Inherited
:指定子类会继承该注解。@SpringBootConfiguration
:该注解表示当前类是Spring Boot的配置类,用于替代传统的XML配置文件。它会被Spring容器加载,并进行相关的自动配置。@EnableAutoConfiguration
:该注解用于开启自动配置功能。它会根据项目的依赖关系和类路径上的类来自动配置Spring应用程序所需的各种组件和功能,如数据库连接、消息队列等。@ComponentScan
:该注解用于指定要扫描的包或类,以及扫描时的过滤规则。在这段代码中,excludeFilters
参数配置了两个过滤器,分别是TypeExcludeFilter
和AutoConfigurationExcludeFilter
,用于排除指定类型的类。
@WebApplicationType
这个过程非常重要,直接决定了项目的类型,应用类型分为三种,都在WebApplicationType
这个枚举类中
-
SERVLET
:表示使用Servlet容器(如Tomcat、Jetty)作为Web服务器部署应用程序。这是最常见的应用程序类型,适用于基于Web的应用程序开发。 -
REACTIVE
:表示使用响应式编程模型,如Spring WebFlux,构建非阻塞的响应式应用程序。这种应用程序类型通常用于处理高并发和大量请求的场景,并能提供更好的性能和扩展性。 -
NONE
:表示不使用任何Web服务器,即应用程序是一个非Web应用程序。这种类型的应用程序通常用于后台任务、调度程序等场景,不涉及Web请求和响应。
ApplicationContextInitializer
可以用于在应用程序启动时对ApplicationContext
进行初始化和配置。它提供了一个回调方法initialize()
,在ApplicationContext
创建之后、在Bean加载之前被调用。
-
配置灵活性:通过实现
ApplicationContextInitializer
接口,开发者可以在应用程序启动时根据需要动态地加载和配置Bean、设置环境变量、注册监听器等。 -
扩展性:通过自定义
ApplicationContextInitializer
,可以将一些通用的初始化逻辑提取出来,使得可以在多个项目中共享和复用。这样可以减少代码的重复性,提高开发效率。 -
解耦合:
ApplicationContextInitializer
可以与Spring的Profile功能结合使用,根据不同的Profile激活不同的初始化逻辑。这样可以使得应用程序的配置更加灵活,并且能够在不同环境中无缝切换。
在Spring Boot中,你可以通过添加监听器(Listener)来监听应用程序的生命周期事件、Servlet上下文事件以及其他自定义事件。Spring Boot提供了多种方式来注册和使用监听器。
- 通过
@EventListener
注解:可以将一个监听器方法标记为@EventListener
注解,并注册到Spring容器中。 - 使用
ApplicationListener
注册Bean:可以将监听器作为一个Bean注册到Spring容器中,并使用addApplicationListener()
方法将其添加到SpringApplication中。例如:
3. 创建IOC容器
源码在run()
方法中,如下:
context = createApplicationContext();
跟进代码,真正执行的是ApplicationContextFactory
方法,如下图:
根据webApplicationType
决定创建的类型,很显然,我这里的是servlet
,因此创建的是AnnotationConfigServletWebServerApplicationContext
。
这一步仅仅是创建了
IOC容器
,未有其他操作。
4. IOC容器的前置处理
这一步真是精华了,在刷新容器之前做准备,其中有一个非常关键的操作:将启动类注入容器,为后续的自动化配置奠定基础。源码如下:
prepareContext(context, environment, listeners, applicationArguments,printedBanner);
prepareContext()
源码解析如下图,内容还是挺多的:
从上图可以看出步骤很多,下面将会详细介绍几个重点的内容。
调用初始化器
在SpringApplication
构建过程中设置的初始化器,从spring.factories
取值的。执行的流程很简单,遍历执行。
将自定义的ApplicationContextInitializer
放在META-INF/spring.factories
中,在此时也是会被调用。
加载启动类,注入容器
这一步是将主启动类加载到IOC容器
中,作为后续自动配置的入口。
在SpringApplication
构建过程中将主启动类放置在primarySources
这个集合中,此时的getAllSources()
即是从其中取值,如下图:
总结:
Spring Boot是一个开源的Java框架,用于简化和加速基于Spring的应用程序的开发和部署。它提供了许多便利功能和约定优于配置的原则,使得构建独立、可扩展且易于维护的应用程序变得更加简单。
-
自动配置:Spring Boot通过使用条件注解和自动配置机制,根据类路径上的依赖关系和配置信息,自动加载和配置各种组件和功能,如数据库连接、Web服务器、安全认证等。这大大简化了应用程序的配置和部署过程。
-
启动流程:Spring Boot的应用程序入口是一个带有
main
方法的Java类。在启动时,通过调用SpringApplication.run()
方法,Spring Boot会创建一个ApplicationContext
容器,并执行一系列的初始化和配置操作,最终启动嵌入式Web容器并监听HTTP请求。 -
条件注解:Spring Boot使用条件注解来控制组件的加载和配置。通过使用
@ConditionalOnClass
、@ConditionalOnProperty
等条件注解,可以根据类的存在与否、配置属性的值等条件来决定是否加载或配置某个组件。这使得应用程序可以根据不同的环境和需求进行灵活的配置。 -
外部化配置:Spring Boot支持将应用程序的配置信息外部化,可以使用多种方式进行配置,如属性文件、YAML文件、命令行参数等。应用程序可以通过
@Value
注解或@ConfigurationProperties
注解来从配置中获取属性值,并根据需要自动绑定到相应的Java对象。 -
监听器模式:Spring Boot提供了一系列的事件和监听器,用于在应用程序的生命周期中处理特定的事件。开发者可以通过实现
ApplicationListener
接口或使用@EventListener
注解来注册监听器,并对事件进行相应的处理。这使得应用程序可以根据需要执行特定的逻辑操作,如初始化资源、加载配置等。 -
功能扩展:Spring Boot支持通过使用Starter和自定义自动配置类来扩展功能。Starter是一个预定义依赖集合,简化了添加所需功能的过程。自定义自动配置类可以通过条件注解和组件扫描来进行自动配置,并将新功能集成到Spring Boot应用程序中。