深入理解 Spring Boot:核心知识与约定大于配置原则

深入理解 Spring Boot:核心知识与约定大于配置原则

简单说一下为什么要有 Spring Boot?

因为 Spring 的缺点。

虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的(需要大量 XML 配置)

为了减少配置文件,简化开发 Spring,所以 Spring Boot 诞生了。

具体演变如下图所示:

image

一般说 Spring 框架指的都是 Spring Framework

说下 Spring Boot 的主要优点

  1. 开发基于 Spring 的应用程序很容易
  2. Spring Boot 项目所需的开发或工程时间明显减少,通常会提高整体生产力。
  3. Spring Boot 不需要编写大量样板代码、XML 配置和注释
  4. Spring 引导应用程序可以很容易地与 Spring 生态系统集成,如 Spring JDBC、Spring ORM、Spring Data、Spring Security 等。
  5. Spring Boot 遵循“固执己见的默认配置”,以减少开发工作 (默认配置可以修改)。
  6. Spring Boot 应用程序提供嵌入式 HTTP 服务器,如 Tomcat 和Jetty,可以轻松地开发和测试 web 应用程序。 (这点很赞!普通运行 Java 程序的方式就能运行基于Spring Boot web 项目,省事很多)
  7. Spring Boot 提供命令行接口(CLI)工具,用于开发和测试 Spring Boot 应用程序,如 Java 或 Groovy。
  8. Spring Boot 提供了多种插件,可以使用内置工具(如 Maven 和 Gradle)开发和测试 Spring Boot 应用程序。

什么是 Spring Boot Starters?

Spring Boot Starters 是 Spring Boot 提供的一组依赖项,用于快速启动常见的应用程序功能。

简单来说,就是一系列依赖关系的集合。

例如,如果想要快速启动一个 Spring Boot Web 应用程序,只需在项目中引入 spring-boot-starter-web 这个依赖即可。

Spring Boot 支持哪些内嵌 Servlet 容器?

有三个:

NameServlet Version
Tomcat 9.0(默认容器)4.0
Jetty 9.43.1
Undertow 2.04.0

Spring boot常用注解有哪些?

Spring Boot 中常用的注解有:

  1. @SpringBootApplication:该注解用于标注 Spring Boot 应用程序主类,表示该类是一个 Spring Boot 应用程序的入口点,可以看作是 @Configuration@ComponentScan@EnableAutoConfiguration 注解的集合。

  2. @Controller:该注解用于标注控制器类,表示该类是 Spring MVC 控制器,处理请求并返回响应。

  3. @RestController:该注解是 @Controller 注解的变体,表示该类是 RESTful API 的控制器类,处理请求并返回 JSON 格式的响应。

  4. @RequestMapping:该注解用于将 URL 请求映射到处理器方法上,可以通过 value 属性指定 URL 地址,通过 method 属性指定请求方法,还可以通过 params 属性和 headers 属性指定请求参数和请求头。

  5. @Autowired:该注解用于自动装配 Spring 容器中的 Bean 对象,可以用于字段、构造方法和 Set 方法上。

  6. @Component:该注解用于标注一个类为 Spring Bean,Spring 会自动扫描这个注解,并将该类注册到 Spring 容器中。

  7. @Bean:该注解用于标注一个方法,表示该方法返回一个 Bean 对象,该对象将被注册到 Spring 容器中。

  8. @Service:该注解用于标注一个服务类,表示该类提供业务逻辑服务,通常与 @Component 注解一起使用。

  9. @Repository:该注解用于标注 DAO 类,表示该类提供对数据库的访问操作,通常与 @Component 注解一起使用。

  10. @Value:该注解用于注入配置文件中的属性值,可以用于字段、构造方法和 Set 方法上。

  11. @Profile:该注解用于指定 Bean 对象所属的环境,可以根据不同的环境来创建不同的 Bean 对象。

  12. @Conditional:该注解可以根据条件来决定是否创建 Bean 对象,可以与 @Profile 注解一起使用,用于根据不同的环境来创建不同的 Bean 对象。

  13. @Configuration:该注解用于标注配置类,表示该类是 Spring 配置类,可以包含 Bean 的定义和配置信息。

  14. @ComponentScan:该注解用于指定要扫描的包或类,以及要扫描的 Bean 的范围。

  15. @EnableAutoConfiguration:该注解用于自动配置 Spring Boot 应用程序,根据项目中添加的依赖项自动配置 Spring 应用程序,使得开发者不需要手动配置 Spring 应用程序。

当在 Spring Boot 应用程序中使用 @ComponentScan 注解时,Spring Boot 将自动扫描注解类所在的包以及其子包下的所有类,将带有 @Component@Service@Controller@Repository 等注解的类注册为 Bean,这样这些 Bean 就可以被注入到其他类中使用了。

Spring 是如何启动的?

以下是一个启动类代码:

@SpringBootApplication
public class DemoApplication {

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

}

启动大概有 9 个步骤:

  1. 创建监听,并准备监听。

  2. 容器环境预配置。

  3. 打印 banner

  4. 创建 Spring 容器(IoC)。

  5. 容器刷新前置处理。

  6. 容器刷新。

  7. 容器刷新后置处理。

  8. 发出容器刷新结束通知。

  9. 调用 runner 执行启动后的相关程序。

具体解析:

  • 创建监听并准备监听,实际上做的就是从 META-INF/spring.factories 中获取关于监听器的类然后返回一个监听器列表
  • 打印 banner,就是在控制台输出一个 logo
  • 容器操作也就是实现 IoC 的步骤了

Spring Boot 的自动配置是如何实现的?

总的来说,Spring Boot 的自动配置是通过条件注解机制优先级机制来实现的.

主要包括以下几个步骤:

  1. Spring Boot 在启动时会扫描 classpath 下的 META-INF/spring.factories 文件,该文件中包含了所有自动配置类的全限定名。

  2. 根据条件注解的条件,Spring Boot 会自动判断哪些自动配置类需要生效。

    条件注解包括 @ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnProperty@ConditionalOnResource@ConditionalOnWebApplication 等。

  3. 如果某个自动配置类需要生效,Spring Boot 会自动将该类的配置信息添加到 Spring 上下文中,这样就可以在应用程序中使用了。

  4. 如果多个自动配置类之间存在冲突,Spring Boot 会根据优先级来决定哪个自动配置类生效。可以通过修改配置文件中的属性值来调整自动配置类的优先级。

SpringBoot 归约大于配置

在 SpringBoot 中,约定大于配置的原则是指:开发人员仅需规定应用中不符合约定的部分,而在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想。总的来说,上面两条都遵循了推荐默认配置的思想。当存在特殊需求的时候,自定义配置即可。这样可以大大的减少配置工作,这就是所谓的 “约定” 。

启动类

启动类只能扫描到【当前包及其子包】下的类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别

【Pytorch】学习记录分享5——PyTorch经典网络 ResNet 1. ResNet (残差网络)基础知识2. 感受野3. 手写体数字识别3. 0 数据集(训练与测试集)3. 1 数据加载3. 2 函数实现:3. 3 训练及其测试: 1. ResNet &…

JFreeChart 生成图表,并为图表标注特殊点、添加文本标识框

一、项目场景: Java使用JFreeChart库生成图片,主要场景为将具体的数据 可视化 生成曲线图等的图表。 本篇文章主要针对为数据集生成的图表添加特殊点及其标识框。具体包括两种场景:x轴为 时间戳 类型和普通 数值 类型。(y轴都为…

阿里云林立翔:基于阿里云 GPU 的 AIGC 小规模训练优化方案

云布道师 本篇文章围绕生成式 AI 技术栈、生成式 AI 微调训练和性能分析、ECS GPU 实例为生成式 AI 提供算力保障、应用场景案例等相关话题展开。 生成式 AI 技术栈介绍 1、生成式 AI 爆发的历程 在 2022 年的下半年,业界迎来了生成式 AI 的全面爆发&#xff0c…

RAG实战案例:如何基于 LangChain 实现智能检索生成系统

在人工智能领域,如何有效结合大型语言模型(LLM)的常识性知识与特定的专有数据,一直是业界探索的热点。微调(Fine-tuning)与检索增强生成(Retrieval-Augmented Generation,简称RAG&am…

5. 行为模式 - 备忘录模式

亦称: 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外, 编辑器中还要有设置文本格式和…

【Docker】基于华为 openEuler 应用 Docker 镜像体积压缩

书接 openEuler 系列文章(可以翻看测试系列),本次跟大家说说如何将 Java 包轻量化地构建到 openEuler 镜像中且保持镜像内操作系统是全补丁状态。 之前我们都是使用现成的 jdk 镜像进行构建的,如下图: FROM ibm-seme…

Docker安装(CentOS)+简单使用

Docker安装(CentOS) 一键卸载旧的 sudo yum remove docker* 一行代码(自动安装) 使用官方安装脚本 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 启动 docker并查看状态 运行镜像 hello-world docker run hello-world 简单使用 使用 docker run …

第八节TypeScript 函数

1、函数的定义 函数就是包裹在花括号中的代码块,前面使用关键字function。 语法: function function_name() {// 执行代码 } 实例: function test() { // 函数定义console.log("我就是创建的名称为test的函数") } 2、调用…

论文阅读——RS DINO

RS DINO: A Novel Panoptic Segmentation Algorithm for High Resolution Remote Sensing Images 基于MASKDINO模型,加了两个模块: BAM:Batch Attention Module 遥感图像切分的时候把一个建筑物整体比如飞机场切分到不同图片中,…

五分钟学完k-means

聚类算法有很多种,K-Means 是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。 K-Means 聚类算法的大致意思就…

Ubuntu18.04、CUDA11.1安装TensorRT

最近想试试推理加速,因为跑的预测有点慢,一开始是打算从数据处理上实现,采用并行数据处理,但是这个有所难度,而且有几张显卡可用,就想着怎么把显卡利用上。而且了解到推理加速后,就先尝试一下看…

1.0.0 IGP高级特性简要介绍(ISIS)

ISIS高级特性 1.LSP快速扩散 ​ 正常情况下,当IS-IS路由器收到其它路由器发来的LSP时,如果此LSP比本地LSDB中相应的LSP要新,则更新LSDB中的LSP,并用一个定时器定期将LSDB内已更新的LSP扩散出去。 IS-IS如何识别LSP的新旧&#x…

[每周一更]-(第35期):为何要用ChatGPT?

为何要用ChatGPT?因为她是工具,而人类需要工具; AI只要没有自主目的性的话就是工具,需要怕的是使用这个工具的人。掌握了提问的艺术,更好利用AI帮助我们完成目标; 最开始2022/12/07 开始注册ChatGPT使用&a…

【C++】开源:libmodbus通信协议库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍libmodbus通信协议库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#x…

PDF控件Spire.PDF for .NET【安全】演示:将加密或解密 PDF 文件

当涉及到在 Internet 上共享机密文档时,PDF 加密是一项至关重要的任务。通过使用强密码加密 PDF 文件,您可以保护文件数据免遭未经授权的人员访问。在某些情况下,可能还需要删除密码才能公开文档。在本文中,您将了解如何使用Spire…

ChatGPT一周年:开源语言大模型的冲击

自2022年末发布后,ChatGPT给人工智能的研究和商业领域带来了巨大变革。通过有监督微调和人类反馈的强化学习,模型可以回答人类问题,并在广泛的任务范围内遵循指令。在获得这一成功之后,人们对LLM的兴趣不断增加,新的LL…

mac电池最大充电限制 AlDente Pro中文 for Mac

热保护:在电池温度较高时为电池充电会导致电池老化更快。启用热保护后,当电池温度过高时,充电将自动停止。 航行模式:通常情况下,即使激活了最大电池充电,您的 MacBooks 电池也会始终稍微充电和放电以保持所…

linux 驱动——私有数据

文章目录 linux 驱动中的私有数据container_of驱动程序数据结构定义 应用程序模块使用 linux 驱动中的私有数据 前面的程序中,都只申请了一个从设备号,这里使用 alloc_chrdev_region 分配两个设备号,这两个设备共用 ops 方法。 所以需要在 …

案例101:基于微信小程序的停车共享小程序

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现

基于JavaSpringbootVueelememt宠物用品商城系统设计实现 🍅 作者主页 程序开发 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录 基于JavaSpringbootVueelememt宠物用品商城系统设计实…