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

news2024/12/28 19:48:31

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

启动类

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时无法自动ORM,如下:2、在SQL中使用 as 为查询字段添加列别名,以匹配属性名:但是如果我…

JDBC的使用

目录 JDBC简介 JDBC的使用 JDBC简介 JDBC(Java DataBase Connectivity)是用Java操作数据库的一套API。 sun公司官方定义的一套操作所有关系型数据库的规范,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)来编…

神经网络:优化器和全连接层

SGD(随机梯度下降) 随机梯度下降的优化算法在科研和工业界是很常用的。 很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。 举个例子:梯度下降(Gradient Descent)就好比一个人想从高山上奔跑到山谷最低…

提升数据处理技巧:Python正则表达式的高级应用

提升数据处理技巧:Python正则表达式的高级应用 引言:探索正则表达式的高级应用高级匹配技巧使用正则表达式处理复杂数据正则表达式的性能优化正则表达式的局限和替代方案 引言:探索正则表达式的高级应用 在数据驱动的世界里,有效…

机器学习笔记:支持向量机回归SVR

1 主要思想 主要思路类似于机器学习笔记:支持向量机SVM_支撑向量学习-CSDN博客 和SVM的区别主要有 解法和SVM区别不大,也是KKT 2 和线性回归的区别 对SVR,如果f(x)和y之间的差距小于阈值ε【也即落在两条间隔带之间】,则不计算…

华为交换配置OSPF与BFD联动

实验拓扑 组网需求 如图所示,SW1、SW2和SW3之间运行OSPF,SW1和SW2之间的交换机仅作透传功能。现在需要SW1和SW2能够快速感应它们之间的链路状态,当链路SW1-SW2发生故障时,业务能快速切换到备份链路SW1-SW3-SW2上 配置思路 采用…

QT isDirty函数

参考:QSqlTableModel 类 |Qt SQL 6.6.1

LeetCode 19 删除链表的倒数第 N 个结点

题目描述 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1…

Flink cdc3.0同步实例(动态变更表结构、分库分表同步)

文章目录 前言准备flink环境docker构建mysql、doris环境数据准备 通过 FlinkCDC cli 提交任务整库同步同步变更路由变更路由表结构不一致无法同步 结尾 前言 最近Flink CDC 3.0发布, 不仅提供基础的数据同步能力。schema 变更自动同步、整库同步、分库分表等增强功…

开发知识点-HTML/JavaScript

HTML/JavaScript xlinksvgviewBoxuse基础预热与语法基础知识js 如何运行页面适用js 及输出 面向对象抽奖功能 json 支持 字符串转数组数组转字符串数组元素删除长度0位添加一个元素// 表示在下标为1处添加一项tttarray.splice(1,0,ttt)//[123,ttt,456]// 数组是否包含某个元素a…

天猫数据分析(天猫查数据工具):2023年天猫平台假发行业市场销售数据分析报告

如今,由于人们工作和生活的压力较大,居民脱发问题严重,且脱发群体倾向于80后和90后,逐渐向低龄化发展。除脱发外,在颜值经济的背景下,人们越来越注重外貌和形象,假发作为一种改善发型的工具&…

MyBatis——MyBatis的原始Dao开发(了解)

MyBatis的原始Dao开发-了解 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。在之前的文章已经给大家介绍了基于代理方式的dao开发&#x…

Javascript 开发html网页读写IC卡源码

本示例使用设备&#xff1a; Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

OSPF面试总结

OSPF 基本特点 属于IGP、LS支持无类域间路由没有环路&#xff08;区域内运行LS、区域间是DV,所以所有的区域要和区域0相连&#xff09;收敛速度快使用组播发送数据 224.0.0.5、224.0.0.6 什么时候用224.0.0.5&#xff1f;支持多条等价路由支持协议报文认证 OSPF路由的计算过程…

嵌入式热门发展方向有哪些?

嵌入式热门发展方向有哪些? 由于嵌入式的薪资待遇和发展前景都非常不错&#xff0c;现在越来越多的学生从计算机、电子、通信、自动化等相关专业跨行学习嵌入式技术&#xff0c;并将嵌入式开发作为未来职业发展的方向。 嵌入式系统设计是电子产品设计的重要组成部分&#xff0…

短视频账号矩阵系统3年独立开发正规接口源码搭建部署开发

一、矩阵系统源码主要有三种框架&#xff1a; 短视频账号矩阵源码的框架有很多种&#xff0c;以下列举其中几种&#xff1a; 1. **星图矩阵**&#xff1a;星图矩阵是抖音官方向商家提供的短视频广告推广平台&#xff0c;是抖音官方的赚钱工具。商家可利用星图矩阵进行广告推广…

【疑问】学前端是不是已经找不到工作了?深度回复“前端已死论”。

随着人工智能和低代码的崛起&#xff0c;“前端已死”的声音逐渐兴起。前端已死&#xff1f;尊嘟假嘟&#xff1f;快来发表你的看法吧&#xff01; 文章目录 一、为什么会出现“前端已死”的言论技术发展框架和工具的泛滥市场饱和全栈开发的兴起 二、你如何看待“前端已死”技术…

7.CentOS7修改主机名

Centos7修改主机名 hostnamectl set-hostname test0[roothostname ~]#hostnamectl set-hostname test[roottest ~]# ← 重新登录后显示hostnamectl 或者hostnamectl status 显示当前主机名设置,查询内核版本&#xff0c;操作系统等信息 hostname有三种状态 transient&…

从 ECMAScript 6 角度谈谈执行上下文

大家好&#xff0c;我是归思君 起因是最近了解JS执行上下文的时候&#xff0c;发现很多书籍和资料&#xff0c;包括《JavaScript高级程序设计》、《JavaScript权威指南》和网上的一些博客专栏&#xff0c;都是从 ES3 角度来谈执行上下文&#xff0c;用ES6规范解读的比较少&…

linux 驱动——私有数据

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