当前位置: 首页 > news >正文

秋招Day17 - Spring - Spring Boot

介绍一下Spring Boot,有哪些优点?

Spring Boot提供了一套默认配置,通过约定大于配置帮我们快速搭建Spring项目骨架。

以前的Spring开发需要配置大量的xml文件,大量第三方jar包依赖还要手动引入。Spring Boot只需要引入一个Starter和@SpringBootApplication注解就可以搞定。

优点有:

  • Spring Boot内嵌了Tomcat、Jetty、Undertow等容器,直接运行jar包就能启动
  • Spring Boot内置了Starter和自动配置,省去了大量手动配置的工作。比如如果项目中添加了 spring-boot-starter-web,Spring Boot 会自动引入并配置 Tomcat 和 Spring MVC
  • Spring Boot内置了ActuatorDevTools,便于调试和监控。

Spring Boot常用注解有哪些?

  1. @SpringBootApplication:Spring Boot 应用的入口,用在启动类上。
  2. 还有一些 Spring 框架本身的注解,比如 @Component@RestController@Service@ConfigurationProperties@Transactional 等。

Spring Boot自动配置原理了解吗?

Spring Boot 会根据项目类路径中存在的 Jar 包、自定义的 Bean 以及各种配置属性,自动推断并创建、配置应用程序所需的各种组件,而无需手动编写大量的配置代码。

在 Spring Boot 中,开启自动配置的注解是@EnableAutoConfiguration它会扫描所有自动配置类

Spring Boot 为了进一步简化,直接通过 @SpringBootApplication 注解一步搞定,该注解包含了 @EnableAutoConfiguration 注解。

main 类启动的时候,Spring Boot 会加载所有自动装配类到内存,但不会立即生效。需要条件注册@Condition评估所有条件都满足后,该配置类才会被Spring容器完全处理,其内部定义的Bean才会被创建并注册到IoC容器中。

如何自定义一个Spring Boot Starter

第一步,创建一个新的 Maven 项目,例如命名为 my-spring-boot-starter。在 pom.xml 文件中添加必要的依赖和配置。

第二步,创建一个简单的服务类 MyService.java

第三步,创建一个配置属性类 MyStarterProperties.java

第四步,在 src/main/java 下创建一个自动配置类,比如 MyServiceAutoConfiguration.java:(通常是 autoconfigure 包下)。

第五步,在 src/main/resources/META-INF 目录下创建 spring.factories 文件,指明所有自动配置类的路径

第六步,使用 Maven 打包这个项目

第七步,在其他的 Spring Boot 项目中,通过 Maven 来添加这个自定义的 Starter 依赖,并通过 application.properties 配置MyService的配置信息

Spring Boot Starter的原理了解吗?

Spring Boot Starter 主要通过起步依赖和自动配置机制来简化项目的构建和配置过程。

起步依赖是 Spring Boot 提供的一组预定义依赖项,它们将一组相关的库和模块打包在一起。比如 spring-boot-starter-web 就包含了 Spring MVC、Tomcat 和 Jackson 等依赖。

自动配置机制是 Spring Boot 的核心特性,通过自动扫描类路径下的类、资源文件和配置文件自动创建和配置应用程序所需的 Bean 和组件。

比如有了 spring-boot-starter-web,我们开发者就不需要再手动配置 Tomcat、Spring MVC 等,Spring Boot 会自动帮我们完成这些工作。

Spring Boot的启动原理了解吗?

一、启动类准备阶段

加载启动类:SpringBoot启动时,会在当前工作目录下扫描带有@SpringBootApplication注解标识的类,并把这个类作为应用程序的入口点。

二、配置加载阶段

加载配置文件:SpringBoot会自动扫描当前项目的resources目录,并加载其中的application.propertiesapplication.yml等配置文件。加载数据库配置参数,日志级别等。

配置环境:创建和配置Environment,该对象包含了应用程序的运行环境信息。

三、初始化ApplicationContext

创建ApplicationContext:根据应用程序类型创建相应的ApplicationContext实例

加载Bean:扫描当前项目中的所有Bean,将它们注册并创建到ApplicationContext中。扫描并处理Starter的自动配置类,根据类路径下的依赖情况和当前应用Bean的配置情况自动配置并创建相应的Bean

四、启动内嵌的Web容器

如果当前项目是一个Web应用,SpringBoot会根据配置信息自动创建Web容器,并将Spring容器注册到Web容器

五、启动应用程序

根据之前创建好的Spring容器以及Web服务器,启动相应的线程进行服务处理

六、监听应用程序的状态

SpringBoot会监听应用程序的状态,并根据需要进行相应的操作。例如,当应用程序退出时,它会打印出详细的日志信息,并将应用程序的上下文环境恢复到初始状态。

七、发布事件

在启动的不同阶段,SpringBoot会发布各种事件,如started()、ready()等,允许开发者在特定的时间点执行自定义的逻辑

八、停止计时并打印日志

StopWatch停止计时,并打印出整个启动过程所花费的时间。

了解@SpringBootApplication注解吗?

@SpringBootApplication是 Spring Boot 的核心注解,经常用于主类上,作为项目启动入口的标识。它是一个组合注解:

  • @SpringBootConfiguration:继承自 @Configuration,标注该类是一个配置类,相当于一个 Spring 配置文件。
  • @EnableAutoConfiguration:告诉 Spring Boot 根据 pom.xml 中添加的依赖自动配置项目。例如,如果 spring-boot-starter-web 依赖被添加到项目中,Spring Boot 会自动配置 Tomcat 和 Spring MVC。
  • @ComponentScan:扫描当前包及其子包下被@Component@Service@Controller@Repository 注解标记的类,并注册为 Spring Bean。

为什么Spring Boot启动的时候能够找到主类上的@SpringBootApplication注解?

启动的时候执行main方法中的run方法,run方法接受两个参数,主应用类、命令行参数。

主应用类也就是main方法属于的类,也就是启动类,SpringBoot会通过反射机制检查这个主应用类,看看上面有没有@SpringBootApplication注解

SpringBoot默认的包扫描路径是什么

启动类所在包及其子包下的所有组件

Spring Boot和Spring MVC区别

Spring MVC是Spring框架的一个模块,提供了Model-View-Controller的开发模式

Spring Boot通过引入Starter依赖并处理自动配置类,实现了约定优于配置的特性,spring-boot-starter-web中集成了Spring MVC的相关依赖,运行时环境也内嵌了Web服务器,所以Spring Boot项目启动后会自动根据类路径下的依赖和当前项目的Bean配置,将Spring MVC的相关配置和组件都自动创建好快速的开发一个Spring MVC的Web项目。

Spring Boot和Spring有什么区别?

Spring Boot在Spring框架的基础上简化了开发、配置和部署,可以帮助我们快速搭建 Spring 项目的骨架,提高生产效率。

特性Spring FrameworkSpring Boot
目的提供企业级的开发工具和库简化 Spring 应用的开发、配置和部署
配置方式主要通过 XML 和注解等手动配置提供开箱即用的自动配置
启动和运行需要打成 war 包到 Tomcat 等容器下运行已嵌入Tomcat等容器,打包成 JAR 文件直接运行
依赖管理手动添加和管理依赖使用 spring-boot-starter 简化依赖管理

 

http://www.dtcms.com/a/293922.html

相关文章:

  • 【图像处理基石】如何实现一个车辆检测算法?
  • Nginx和Apache的区别
  • 多维任务筛选工具功能解析:如何通过智能筛选功能精准对接任务需求?
  • There are 2 missing blocks. The following files may be corrupted
  • 亚马逊AI新项目Starfish:重构电商Listing生态的机遇与挑战
  • 西班牙智能警示灯法案:引领欧洲智能交通新趋势
  • 0.0 深度学习资料网站
  • 工业控制系统的现状与发展趋
  • 分享一个tauri-plugin-http的工具类
  • python3写一个异步流式 http 接口服务调用大模型(async, stream, sanic)---6.2
  • 基于数据挖掘的短视频点赞影响因素分析【LightGBM、XGBoost、随机森林、smote】
  • 探索大语言模型(LLM):提升 RAG 性能的全方位优化策略
  • 深圳TCL外包岗位要去吗?
  • NLP基础全面解析:从概念到实践
  • 主要分布在背侧海马体(dHPC)CA1区域(dCA1)的时间细胞对NLP中的深层语义分析的积极影响和启示
  • WebGIS 中常用空间数据格式
  • Linux网络:网络层-IP协议
  • 金仓 KEMCC 非云环境初始化与纳管指南
  • 每日一算:华为-批萨分配问题
  • 异常的传递性|模块的概念和导入|自定义模块并导入
  • Nginx + PM2 实现Express API + React 前端 本地测试服务器搭建
  • 从 Shell 脚本到 Go 应用:使用 Kiro AI 助手完成 Harpoon 项目重构的完整实践
  • [特殊字符] 从数据库无法访问到成功修复崩溃表:一次 MySQL 故障排查实录
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十二课——车牌识别的FPGA实现(4)车牌字符的分割定位
  • 基于Tornado的WebSocket实时聊天系统:从零到一构建与解析
  • 简单理解现代Web应用架构:从简单到企业级
  • 棱镜技术在光谱相机中应用
  • 【Unity实战100例】Unity资源下载系统开发流程详解(移动端、PC端 ,局域网控制台服务)
  • K8s:离线部署Kubernetes1.26.12及采用外部Harbor
  • DApp的未来发展趋势是什么?