SpringBoot概述
spring springmvc springboot的关系
- spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc。
- spring mvc 是只是spring 处理web层请求的一个模块。
因此他们的关系大概就是这样:
spring mvc < spring < springboot
Spring Boot
Spring Boot对Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
Spring 的缺点:配置繁重
简介
- 简化spring应用开发的框架
- 整个spring技术栈的整合
- J2EE 一站式解决方案
微服务
- 单体服务(
all in one
)- 一个项目包含所有功能的应用程序
- 微服务
- 微服务是一种系统架构的设计风格,主旨是将原本复杂的系统拆分成多个独立的小型服务,每个服务维护自身的业务逻辑、数据处理和部署,服务与服务之间通过简单的通信协议进行通信 (比如留下的 restful API),不要求每一个微服务使用同一种变成语言编写。
- 现代开发模式正在由单体服务转向微服务这种开发模式
- Java 微服务框架普遍使用Spring Cloud,微服务将系统拆分成多个小型服务,它就是基于 Spring Boot做的。
springboot的优点
- 为基于Spring的开发提供更快的入门体验
- 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
- 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
- Spring Boot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
核心功能
-
起步依赖
-
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
-
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
-
-
自动配置
- Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
SpringBoot搭建
使用IDEA快速搭建 Spring Boot项目
- 创建一个空项目【相当于 eclipse 里面的工作空间】
- 项目里面添加一个
Module
选择Spring Initializr
- 设置
GAV
坐标和pom
配置信息 - 选择 版本和依赖
- 创建完成 等待导入依赖
注意:新创建的类一定要位于 …Application同级目录或者下级目录,否则 SpringBoot 加载不到。
入门案例研究
项目结构
- static:存放静态资源 如css,js,图片等
- templates:存放 web 页面的模板
- application.properties、application.yml 存放依赖模块的配置信息 默认空 如 spring、springmvc、mybatis、redis等
- .mvn|mvnw|mvnw.cmd:使用脚本操作执行 maven 相关命令,可删除
- .gitignore:使用版本控制工具 git 的时候,设置一些忽略提交的内容,可删除
- …Application.java:SpringBoot 程序执行的入口,执行该程序中的 main 方法
pom 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--
该POM继承了SpringBoot 框架的一个父项目spring-boot-starter-parent,所有自
己开发的 Spring Boot 都必须的继承spring-boot-starter-parent。
父工程的作用是统管理Spring Boot应用里面的所有依赖版本
以后我们导入依赖默认是不需要写版本
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--当前项目的 GAV 坐标-->
<groupId>com.eshop</groupId>
<artifactId>eshop-th</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--maven 项目名称,可以删除-->
<name>eshop-th</name>
<!--maven 项目描述,可以删除-->
<description>eshop-th</description>
<!--maven 属性配置,可以在其它地方通过${}方式进行引用-->
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- thymeleaf模板引擎依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--
SpringBoot 框架 web 项目起步依赖,通过该依赖自动关联其它依赖,不需要我们一
个一个去添加jar包了。
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot 框架的测试起步依赖,例如:junit 测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatis + mysql -->
<!--MyBatis 整合 SpringBoot 的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--MySQL 的驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<!--
SpringBoot 提供的打包编译等插件
这个插件,可以将应用打包成一个可执行的jar包
将这个应用打成jar包,直接使用java -jar的命令进行执行;
-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<!-- 配置 mapper文件的路径 加载到资源 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
-
父项目:统一管理 jar 包的版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> 直接点进去,他的父项目是: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.6.1</version> </parent>
以后我们导入依赖默认是不需要写版本;(没有在
dependencies
里面管理的依赖还是需要声明版本号的)
-
启动器:导入依赖的 jar 包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- spring-boot-starter是spring-boot启动器,spring‐boot‐starter‐web帮我们导入了web模块 正常运行所依赖的jar包;
- Spring Boot将所有的功能都抽取出来,做成一个个的starters(启动器),只需要在项目里面 引入这些starter 相关功能的所有依赖都会导入进来。要用什么功能就导入什么功能的启动器
主程序类,主入口类
package com.eshop;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EshopThApplication {
public static void main(String[] args) {
SpringApplication.run(EshopThApplication.class, args);
}
}
- @SpringBootApplication注解标注在某个类上,说明这个类是SpringBoot的主配置类, SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;
- 将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到 Spring容器
配置文件、加载顺序
开启配置文件注释
<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
配置文件和加载顺序
-
默认的:
application.properties
,初始里面是空的-
后面的
application-dev.properties
:另一个配置文件 在默认文件开启使用 -
# 服务端口 #server.port=9091 # 开启 dev 的这个配置文件 spring.profiles.active=dev
-
-
yml格式的
-
这是一种新兴的格式 注意空格 使用和上面默认的差不多 但是默认的优先级高于这个
-
spring: datasource: url: jdbc:mysql://localhost:3306/boot_crm?serverTimezone=UTC username: root password: 123 driver-class-name: com.mysql.cj.jdbc.Driver
-
-
多环境配置
-
在主文件激活
激活开发环境 #spring.profiles.active=dev #激活生产环境 #spring.profiles.active=product #激活测试环境 spring.profiles.active=test
-
其它文件的命名方式
-
日志框架、日志配置
日志概述
基础介绍
市面上常见的日志框架有很多。通常情况下,日志是由一个抽象层+实现层的组合来搭建的,而用户通常来说不应该直接使用具体的日志实现类,应该使用日志的抽象层。
抽象层:JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、jboss-logging
实现层:Log4j 、JUL(java.util.logging)、Log4j2、Logback
SpringBoot
默认选择的是 **SLF4J** + **Logback**
的组合,如果不需要更改为其他日志系统(如 Log4j2 等),则无需多余的配置,LogBack
默认会将日志打印到控制台上。
新建的 Spring Boot 项目一般都会引用 spring-boot-starter 或者 spring-boot-starter-web,而这两个起步依赖中都已经包含了对于 spring-boot-starter-logging 的依赖,所以,我们无需额外添加依赖
基本用法
日志级别从小到大为 trace < debug < info < warn < error < fatal,默认日志级别设置为 INFO。所以之前的是看不见的。
@Test
void contextLoads() {
Logger logger = LoggerFactory.getLogger(EshopThApplicationTests.class);
logger.trace("追踪信息");
logger.debug("调试信息");
logger.info("操作信息");
logger.warn("警告信息");
logger.error("错误信息");
}
如果项目有使用 Lombok 的话,直接使用
@Slf4j
注解可以省去从日志工厂生成日志对象这一步,直接进行日志记录。下面代码的效果同上面是一样的
设置日志级别
在配置文件中修改:application.properties
- 全局设置
logging.level.root=trace
- 具体某个包
logging.level.com.example=trace
日志文件生成
-
日志保存到文件,配置文件中设置路径
logging.file.path=/Volumes/BOOTCAMP/log/
-
通过
logging.file.path
生成的日志文件名字为spring.log
,如果需要自定义文件名字,则通过logging.file.name
属性进行配置(此时不需要再配logging.file.path
)logging.file.name=/Volumes/BOOTCAMP/log/my.log
-
不管何种设置,
Spring Boot
都会自动按天分割日志文件,也就是说每天都会自动生成一个新的log
文件,而之前的会自动打成GZ
压缩包。 -
除此之外,我们还可以设置日志文件的保留时间,以及单个文件的大小
-
# 日志文件大小 logging.file.max-size=10MB # 保留的日志时间 logging.file.max-history=10
-
logback-spring.xml
复杂的场景需编写配置文件logback-spring.xml
,在里面可以满足生产级别的要求,不用去配置,框架自己会去读。
- 把日志输出到指定的目录,并按照日期
yyyy-MM-dd
的格式按天存储,注意如果没有特别指定,这里的目录 applog 就是指项目的根目录(如果您的项目是多模块配置并不是指模块的目录)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--按天生成日志-->
<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<!-- 过滤器,只打印ERROR级别的日志 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>
applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>15</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} -%msg%n
</Pattern>
</layout>
</appender>
<logger name="com.fishpro.log" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</logger>
<!-- 设置Spring&Hibernate日志输出级别 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.mybatis" level="WARN"/>
<logger name="com.ibatis" level="DEBUG"/>
<logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG"/>
<logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG"/>
<logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="com.ruidou.baoqian.mapper" level="DEBUG"/>
<!-- 开发环境下的日志配置 -->
<root level="error">
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</root>
</configuration>