SpringBoot学习(一)引入、分析、核心

文章目录

  • SpringBoot
    • 特性
    • 示例
      • 总结
        • 简化整合
        • 简化开发
        • 简化配置
        • 简化部署
        • 简化运维
      • Spring Initializer创建向导
    • 应用分析
      • 依赖管理机制
      • 自动配置机制
        • 初步理解
        • 完整流程
      • SpringBoot学习点
    • 核心技能
      • 常用注解
      • YAML配置文件
        • 基本语法
        • 示例
        • 辅助工具lombok
      • 日志配置
        • 简介
        • 格式组成
        • 记录日志
        • 日志级别
        • 日志分组
        • 文件输出
        • 文件归档与滚动切割
        • 自定义

SpringBoot

springboot帮助开发者简单、快速地创建一个独立的、生产级别的spring应用。大部分秩序编写少量配置即可快速整合spring平台及第三方技术;

特性

  1. 快速创建独立应用;
    SSM:导包、配置、运行
  2. 直接嵌入Tomcat、jetty or undertow(无需部署war包),直接jar包即可;
  3. 提供可选starter,简化应用整合;

场景启动器(starter)
导包一堆,控制版本
为每种场景准备对应依赖

  1. 按需自动配置Spring及三方库;

若要使用场景(生效),则自动配置对应内容
约定大于配置,每个场景有各自默认配置
支持自定义配置文件

  1. 提供监控指标、健康检查、外部化配置等生产级特性;
  2. 无代码生成、无xml;

示例

  1. pom.xml中添加<parent> <dependency>
<!--所有springboot项目都必须继承自spring-boot-starter-parent-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.5</version>
</parent>
<dependencies>
    <!--web开发启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  1. 主程序
@SpringBootApplication//标志为springboot应用
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(mainApplication.class, args);
    }
}
  1. 业务
//@ResponseBody和@Controller组合
//每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中
@RestController
public class Controller {
	//用于类和方法上,用于定义HTTP GET请求的URL路径。
	//当客户端发送HTTP GET请求时,
	//Spring Boot会自动将请求映射到具有相应URL路径的控制器方法上。
    @GetMapping("/Hello")
    public String hello() {
        return "Hello There";
    }
}
  1. 测试
    在这里插入图片描述
  2. 打包
    maven clean package将项目达成可执行的jar包
    java -jar demo.jar启动项目
先导入
<!--springboot打包应用-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

总结

简化整合

导入相关场景:

官方命名:spring-boot-starter-*
第三方命名:*-spring-boot-starter

简化开发

无需编写配置,直接开发业务

简化配置

resources.application.properties进行集中式管理配置

简化部署

打包为可执行 jar 包,使得环境中只需有java环境即可

简化运维

运行时修改配置,只需在外部启用一个application.properties文件,监控、健康检查等

Spring Initializer创建向导

快速创建项目及结构
在这里插入图片描述

应用分析

依赖管理机制

  1. maven依赖传递,A-B-C,拥有A则拥有B、C
  2. boot项目拥有父项目spring-boot-starter-parent,其也拥有父项目spring-boot-dependencies,这个项目中声明了所有常见 jar 依赖的版本号。若要自定义则在pom.xml中就近声明
    在这里插入图片描述
  3. 第三方库的 jar 包需要自行声明版本号

自动配置机制

初步理解
  1. 自动配置的Tomcat、SpringMVC等
  2. 默认的包扫描规则:
    默认扫描主程序所在的包(com.*.boot)及其下的子包,代替component-scan功能;
    自定义扫描路径:
    @SpringBootApplication(scanBasePackages = "com.*") or
    @ComponentScan("com.*")
  3. 配置默认值
    配置文件的所有配置项都适合特定属性类对象值一一绑定的,如Tomcat服务器有关配置—ServerProperties,文件上传有关配置—MultipartProperties
  4. 按需记载自动配置
    场景启动器会首先导入spring-boot-starter作为核心,其是所有starterstarter
    核心也会导入一个spring-boot-autoconfigure,其中为各种场景的自动配置类;
完整流程
  1. 导入starter-web,引入web开发厂场景
  • 场景启动器导入相关所有依赖:starter-json starter-tomcat springmvc
  • 每个启动器都引入spring-boot-starter的核心启动器;
  • 核心启动器引入spring-boot-autoconfigure包;
  • spring-boot-autoconfigure囊括所有场景的所有配置;
  • SpringBoot默认扫描不到spring-boot-autoconfigure下写好的所有配置类(已做整合操作),默认只扫描主程序所在包;
  1. 主程序SpringBootApplication
  • @SpringBootApplication由三个注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
  • @EnableAutoConfiguration:SpringBoot开启自动配置的核心
  • @Import(AutoConfigurationImportSelector.class)提供功能:向容器中批量导入组件;
  • SpringBoot默认加载142个配置类;
  • 该142个配置类是由spring-boot-autoconfigure下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import文件指定;
  • 项目启动的时候利用@Import批量导入组件机制,把autoconfigure包下的142个*AutoConfiguration类导入进来(自动配置类);
  • 按需生效:不是每个自动配置类都能生效,只有条件注解@ConditionalOn*成立,才能生效;
  1. *AutoConfiguration自动配置类
  • 给容器中使用@Bean放一堆组件;
  • 每个自动配置类都有可能有@EnableConfigurationProperties(ServerProperties.class),用来将配置文件中配的指定前缀的属性值封装到*Properties属性类中;
  • 以Tomcat为例,服务器所有配置都已server开头,配置都封装到了特定属性类中;
  • 容器中所有组件的一些核心参数,都源于*Properties*Properties都是和配置文件绑定的;
  • 只需要修改配置文件,核心组件的底层参数就能被修改;
  1. 业务阶段,无需关心底层整合

效果:导入starter,修改配置文件,就能修改底层行为

SpringBoot学习点

  1. 理解自动配置原理
    a.导入starter --> 生效*AutoConfiguration --> 组件 --> *properties --> 配置文件
  2. 理解其他框架底层.
  3. 能够定制化任何组件

初级开发:导入、Controller、Service、Mapper、少量修改配置文件
高级开发:自定义组件、自定义配置、自定义starter

核心技能

常用注解

SpringBoot采用全注解方式驱动

  1. 组件注册
常用组件作用
@Configuration将类注册为配置类,其本身也是容器中的组件
@SpringBootConfiguration同上,但特别指SpringBoot中的配置类
@Bean在容器中注册组件,名称默认为方法名的小驼峰形式,也可以直接("*")修改注解的值
@Scope组件默认为单实例,通过("prototype")修改为多例
@Import导入第三方组件
@ComponentScan修改默认扫描包路径
  1. 条件注解
    @ConditionalOnXxx:若注解指定的条件成立,则触发后续指定行为
常见条件注解条件
@ConditionalOnClass若类路径中存在这个类(@ConditionalOnClass(value="com.*.*.*"),则触发后续行为
@ConditionalOnMissingClass若类路径中不存在这个类,则触发后续行为
@ConditionalOnBean若类路径中存在这个类(@ConditionalOnBean(value="****.class"),则触发后续行为
@ConditionalOnMissingBean若类路径中不存在这个类,则触发后续行为
  1. 属性绑定
    将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

@ConfigurationProperties

给容器中注册组件(@Component、@Bean)
使用此标签声明组件和配置文件的哪些前缀进行绑定
@ConfigurationProperties(perfix = "(配置文件中的定义)")

@ EnableConfigurationProperties

开启指定组件的属性绑定
默认会把该组件自动放入容器中

  • 快速注册注解,主要用于导入第三方包中的注解。因为SpringBoot默认扫描路径不同,即使组件上标注了@Component``@ConfigurationProperties注解,也无法发挥作用

YAML配置文件

用以解决SpringBoot集中化管理的application.properties文件,配置过多后难以阅读和修改,层级结构辨识度不高的问题;其设计目标是方便读写、层次分明,以.yaml.yml作为后缀名

基本语法
  1. 大小写敏感
  2. 使用缩进标识层级关系,k: v,中间用空格分割
  3. 缩进时不适用Tab,只允许空格执行
  4. 缩进的空格数量不重要,只要求相同层级元素左侧对其
  5. #表示此行从该符号起成为注释
  6. 支持写法:
  • 对象:键值对的集合,如:映射O(map)/哈希(hash)/字典(dictionary)
  • 数组:一组按次序排列的值,如:序列(sequence)/列表(list))
  • 纯量:单个的、不可再分的值,如:字符串、数字、布尔、日期
示例
  1. application.properties
person.name=Max
person.age=18
person.birthDay=2006/3/5
person.like=true
person.friend.name=Chloe
person.friend.age=19
person.friend.birthDay=2005/1/3
person.doe[0].name=cake
person.dog[0].age=3
person.doe[1].name=cookie
person.dog[1].age=2
person.cats.c1.name=candy
person.cats.c1.age=1
person.cats.c2.name=snack
person.cats.c2.age=3
  1. application.yml
person:
  name: Max
  age: 18
  birth-day: 2006/3/5
  like: true
  friend:
    name: Chloe
    age: 19
    birth-day: 2005/1/3
  dogs:
    -name: cake
     age: 3
    -name: cookie
     age:2
  cats:
    c1: 
      name: candy
      age: 1
    c2: {name: snack,age: 3}
辅助工具lombok
  1. 引入依赖
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<scope>compile</scope>
</dependency>
  1. 置于类前
注解作用
@Date自动生成JavaBean属性的getter/setter方法
@NoArgsConstructor自动生成无参构造
@AllArgsConstructor自动生成全参构造
  1. 细节
  • birthDay推荐为birth-day,驼峰换为短横线连接;
  • 文本中单引号不会转义字符,双引号会转义字符;
  • 长文本存放时,使用|会保留原本信息,>会将换行符替换为空格;
  • ---三个下划线标识下列文本为同一部分,可收缩至一处;

日志配置

  • 项目中应用日志记录信息,而非System.out.println()
  • 应选择一个日志门面作为接口,一个日志实现作为实现
日志门面日志实现
JCL(Jakarta Commons Logging)
SLF4j(Simple Logging Facade for Java)
jboss-logging
Log4j
JUL(java.util.logging)
Log4j2
Logback
简介
  1. Spring使用commons-logging作为内部日志,但底层实现是开放可对接其他日志框架的
  2. SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件
  3. logback默认使用
  4. SpringBoot默认配置流程:
  • 每个场景启动器导入的核心启动器,都会引入日志功能spring-boot-starter-logging
  • 默认使用logback + slf4j组合作为底层日志
  • 日志在系统启动时开始使用,*AutoConfiguration是系统启动结束后才放置的组件
  • 日志是利用ApplicationListener监听器机制实现配置
  • 所有日志配置都可通过logging开头的配置文件修改
格式组成
  • 时间日期:毫秒级
  • 日志级别:FATALERRORWARNINFODEBUGTRACElogback没有FATAL
  • 进程ID
  • —:消息分割符
  • 线程名:使用[ ]包含
  • Logger名:常为产生日志的类名
  • 消息:日志记录的内容
记录日志
Loggoer logger = LoggerFactory.getLogger(getClass());

或用@Slf4j进行注解

@Slf4j
@RestController
public class Controller {
	@GetMaaping("/h")
	public string hello() {
		log.info("hello world");
		return "hello wordl";
	}
}
日志级别
  1. 只会打印指定级别以上的日志
  2. 不指定级别的所有类,都使用root指定的级别作为默认
  3. SpringBoot日志默认级别是INFO
  4. 操作:
  • application.properties/yml中配置logging.level.<logger-name> = <level>指定级别
  • level范围:TRACE, DEBUG, INFO, WARN, ERRO, FATAL, OFF,定义在LogLevel类中
  • rootlogger-nameroot,可通过配置logging-level-root = *来配置所有未指定类的日志级别
日志分组

将相关logger分在同组,统一配置

eg.Tomcat
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace

SpringBoot已预定义两个分组

weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework..jdbc.core, org.hibemate.SQL, org.jooq.tools.LoggerListener
文件输出
logging.file.namelogging.file.path示例效果
未指定未指定null金控制台输出
指定未指定my.log写入指定文件,可同时指定路径
未指定指定/var/log写入指定目录,默认为spring.log
指定指定my.log
/var/log
忽略path,以name为准
文件归档与滚动切割
  • 归档:指定时间段的日志文件单独存入一个文档
  • 切割:超过指定大小的文件切割到新文件中
  1. 若未指定,仍使用SpringBoot默认logback日志,则可通过application.properties/yaml文件指定日志滚动规则
  2. 其它日志系统需要自行配置xml文件
  3. 滚动设置规则:
配置项描述
logging.logback.rollingpolicy.file-name-patter日志存档的文件名格式(默认值:${LOF_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.clean-history-on-start应用启动时是否清楚过往存档(默认值:false
logging.logback.rollingpolicy.max-file-size文件切割最大大小(默认:10MB)
logging.logback.rollingpolicy.total-size-cap日志总量容纳最大值,超出后删除旧日志文件(默认值:0B)
logging.logback.rollingpolicy.max-history日志文件保存最大天数(默认值:7)
自定义
  1. 若自行配置xmlgroovy文件,推荐使用-spring变量(例如Log4j2-spring.xml而非Log4j2.xml),便于Spring完全控制日志初始化
  2. 可自由组合不同框架和不同格式配置文件

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

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

相关文章

看AI赋能数智化 | Gooxi AI服务器闪耀CITE 2024

4月9日“中国电子信息博览会暨2024 AI算力产业大会”在深圳如期开展&#xff0c;Gooxi携最新产品、行业应用全栈解决方案出席盛会&#xff0c;全面展示Gooxi回应数智新时代下机遇与挑战的丰富AI创新实践成果。 All in AI&#xff0c;奔赴新质生产力 作为中国领先的服务器解决…

题目 2348: 信息学奥赛一本通T1436-数列分段II【二分答案】

信息学奥赛一本通T1436-数列分段II - C语言网 (dotcpp.com) #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define int long long const int N1e5100; const int inf1e9; int n,m; int a[N]; bool check(int mid) {int s…

Linux网络名称空间和虚拟机有何区别

在Linux系统中&#xff0c;网络名称空间和虚拟机都是实现资源隔离和虚拟化的技术&#xff0c;但它们在设计理念、实现机制、资源消耗、使用场景等方面存在着显著的区别。本文旨在全方位、系统性地分析这两种技术的区别。&#x1f50d; 1. 设计理念与实现机制 1.1. 网络名称空…

中通科技数仓数据治理实践

目录 一、背景 1.1 中通数仓架构介绍 1.2 中通数仓层级划分 1.3 中通数据现状 1.4 中通数仓现面临的压力 二、数据仓库具体实践 2.1 时效治理 2.1.1 数据入仓治理 2.1.2 核心模型治理 2.2 存储治理 2.3 内存治理 2.3.1 内存浪费治理 2.3.2 数据倾斜治理 2.3.3 内…

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

C语言操作符详解(三)

一、表达式求值 1.1整型提升 C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 如何进行整型提升呢&#xff1f; 1. 有符号整数提升是按…

高并发高性能接口中,异步打印并采集业务日志的实现方案

一、背景 高并发接口中&#xff0c;为了提高接口的高性能&#xff0c;在需要保存审计及操作记录的时候&#xff0c;往往有以下常见方案&#xff1a; 保存到redis数据库异步保存到mysql/mongodb/es等数据库logger打印业务日志&#xff0c;采集与展示则交由elk模块 对于第一种…

基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的箱包存储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【web开发01】前端开发HTML、CSS-新浪新闻的实现

前端开发HTML、CSS-新浪新闻的实现 1 实现标题排版1.1图片连接的三种方式1.2 具体代码1.3 总结1.< h1>到< h6>是标题从大到小 2 实现标题样式2.1 css的三种引入方式2.2 颜色的三种表示2.3 css选择器2.4 超链接 3 实现正文排版3.1 视频标签 video3.2 音频标签 audio…

Spring高手之路17——动态代理的艺术与实践

文章目录 1. 背景2. JDK动态代理2.1 定义和演示2.2 不同方法分别代理2.3 熔断限流和日志监控 3. CGLIB动态代理3.1 定义和演示3.2 不同方法分别代理&#xff08;对比JDK动态代理写法&#xff09;3.3 熔断限流和日志监控&#xff08;对比JDK动态代理写法&#xff09; 4. 动态代理…

功能强大:JMeter 常用插件全解析

JMeter 作为一个开源的接口性能测试工具&#xff0c;其本身的小巧和灵活性给了测试人员很大的帮助&#xff0c;但其本身作为一个开源工具&#xff0c;相比于一些商业工具&#xff08;比如 LoadRunner&#xff09;&#xff0c;在功能的全面性上就稍显不足。这篇博客&#xff0c;…

Java学习42-Java 流(Stream)、文件(File)和IO - FileReader\FileWriter的使用

IO流 IO流的概述&#xff0c;分类等 Java程序中&#xff0c;对于数据的输入输出以stream方式进行&#xff0c;可以看作是一种数据的流动。 IO流中的IO是Input和Output的缩写&#xff0c;是非常实用的技术&#xff0c;用于处理设备之间的数据传输。读写文件&#xff0c;网络通…

JUC并发编程2(高并发,AQS)

JUC AQS核心 当有线程想获取锁时&#xff0c;其中一个线程使用CAS的将state变为1&#xff0c;将加锁线程设为自己。当其他线程来竞争锁时会&#xff0c;判断state是不是0&#xff0c;不是自己就把自己放入阻塞队列种&#xff08;这个阻塞队列是用双向链表实现&#xff09;&am…

聚丙烯PP材料粘接方法?泰达克TADHE专用于PP材料塑料粘接的UV胶水提供了解决方案

PP&#xff08;聚丙烯&#xff09;&#xff0c;简称PP。 PP是一种疏水性的塑料&#xff0c;需要特殊的处理后再和胶水粘接&#xff0c;以确保良好的粘接效果。常用的PP材料粘接方法&#xff1a; ​1.表面处理 因PP表面的疏水性&#xff0c;可以先进行表面处理。使用酒精或丙酮…

完整的项目源码!在线考试完整系统源码(可接私活)

最近有一些读者问我有没有完整的基于SpringbootVue的项目源码&#xff0c;今天给大家整理了一下&#xff0c;并且录制了搭建的教程&#xff0c;无偿分享给大家。 一、系统运行图 1、登陆页面 2、后台管理 3、全套环境资源 ​源码文件部分截图&#xff0c;带视频教程 ​ 在实际…

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

linux的io的知识大全

C语言的io操作 写文件 #include<stdio.h> #include<string.h>#define FILE_NAME "log.txt" int main() {FILE * fp fopen(FILE_NAME, "w");if(fpNULL){printf("fopen error!\n");}const char* msg "hello zk\n";int c…

如何准确测量电源噪声

目录 电源噪声的特点 影响噪声测试的因素 总结 电源噪声的特点 以往电源噪声的幅度规范一般在几十mV&#xff0c;但是随着芯片电源电压的降低&#xff0c;很多芯片的电源噪声的规范已经低至mV的量级&#xff0c;某些对电源噪声敏感的芯片要求甚至到了百uV的量级。 电源上的…

基于Android studio 实现外卖(点)订餐系统-编程乐学最新原创

&#x1f345;文章末尾有获取完整项目源码方式&#x1f345; 目录 一、实现介绍 视频演示 1.1 启动页 1.2登录页 1.3注册页 1.4商家主页 1.5商家发布商品页面 1.6商家我的页面 1.7商家个人信息修改页 1.8商家商品信息修改页 1.9用户首页 1.10用户我的订单页面 1.1…