SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常

目录

一、创建一个SpringBoot程序

二、SpringBoot的特点

①主要特点

②其他特点

 ③热部署

启动热部署

关闭热部署

三、SpringBoot的配置文件

①SpringBoot三种配置文件的格式(以设置端口号为例):

②配置文件的优先级


③常见配置项

1.配置数据源

2.关闭日志图标(banner)

3.设置运行日志的显示级别  


④读取yaml和yml文件中的数据

1.读取单一数据

2.读取全部数据

3.读取对象数据


⑤多种环境开发(yaml单文件版)

1.配置激活选项

2.在不同的配置环境下添加英文三个横杠(---)可以让idea区分不同的环境

四、logback记录日志

①logback初始化步骤


②使用日志文件记录日志

1.导入依赖:spring-boot-starter-logging

2.在配置文件中设置日志文件的名字

3.创建一个logback的配置文件logback.xml,日志输出到哪个目录的哪个文件下,输出的格式输出的日志级别

4.创建log对象去写日志,检测是否能够打印运行日志


五、配置过滤器,拦截器,全局异常捕获

①使用SpringBoot的配置类来添加过滤器

1.编写Filter类

2.使用SpringBoot提供的FilterRegistrationBean来对Filter进行配置

3.测试

②配置拦截器

1.实现一个Intercepter类

2.写一个配置类

3.测试

​编辑

③设置全局捕获异常

1.创建一个异常类,在其class上注解@ControllerAdvice,在其方法上加上注解@ExceptionHandler(value=Exception.class)

2.测试,做一个会让程序报错的动作,去查看是否会显示“页面无法加载”


一、创建一个SpringBoot程序

在之前写过一篇如何创建SpringBoot程序,两种方式,方法1:通过maven创建SpringBoot项目

方法2:使用Spring Initialzr创建一个SpringBoot项目(缺点:当创建项目时网络中断,会导致程序有部分缺失,并且在程序初始加载的时候不会报错,在后续的项目进程中可能会无法发现报错的原因)

SpringBoot--入门、创建一个SpringBoot项目、测试_springboot创建测试类-CSDN博客

二、SpringBoot的特点

①主要特点

  1. 为基于Spring的开发提供更快的入门体(不需要写测试类,有启动类,不用配置tomcat)
  2. 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求(例如:server.port即端口号的默认值为8080,SpringBoot可以修改这个值)
  3. 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器(Tomcat)、安全、指标,健康检测、外部配置等
  4. SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式

②其他特点

  1. SpringBoot在项目创建时会添加一个<parent>标签,其意义是帮助开发者进行统一的项目版本管理
  2. SpringBoot使用starter可以帮助开发者减少依赖配置(

    二者的区别:(一)starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的

    (二)parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的

  • 这个spring-boot-dependencies中定义了两组信息:第一组是各式各样的依赖版本号属性,第二组是各式各样的依赖坐标信息

 ③热部署

什么是热部署?

在服务器启动后改动程序不需要再重启服务器,服务器会自己悄悄把更新后的程序加载一遍

启动热部署

第一步:在pom.xml文件中导入依赖

第二步:构建项目,可以使用快捷键(Ctrl+F9)激活此功能

以上为手动开启热部署,现在介绍如何自动开启热部署

第一步:打开【File】,选择【settings...】,在面板左侧的菜单中找到【Compile】选项,然后勾选【Build project automatically】,意思是自动构建项目

第二步:允许在程序运行时进行自动构建(因为我的idea为2023版,所以介绍的是2023版的方式)

勾选:settings->Advanced Settings->编译器->编译器中的第一个选项,如下图,点击应用

关闭热部署

        线上环境运行时是不可能使用热部署功能的,所以需要强制关闭此功能,通过配置可以关闭此功能。

spring:devtools:restart:enabled: false

        如果担心配置文件层级过多导致相符覆盖最终引起配置失效,可以提高配置的层级,在更高层级中配置关闭热部署。例如在启动容器前通过系统属性设置关闭热部署功能。

@SpringBootApplication
public class Application {public static void main(String[] args) {System.setProperty("spring.devtools.restart.enabled","false");SpringApplication.run(Application.class);}
}

三、SpringBoot的配置文件

①SpringBoot三种配置文件的格式(以设置端口号为例):

  • properties格式

  • yml格式

  • yaml格式

  • application.properties(properties格式)

server.port=8080
  • application.yml(yml格式)

server:port: 8081
  • application.yaml(yaml格式)

server:port: 8082

②配置文件的优先级

测试:在三种配置文件中分别设置不同的端口号,看哪一个端口号访问时会生效,则哪一个配置文件的优先级更高

application.yaml

application.properties

application.yml

测试成功,8082端口成功显示数据,即表示application.properties文件的端口生效了

测试失败,则表示application.yaml文件的端口号无法生效

但是这就表示该配置文件的其他配置没有生效吗,事实表明生效了,在.yaml文件中配置了一个关闭运行日志图表 ,控制台则并没有打印出日志图标,所以得出结论:每个配置文件中的项都会生效,只不过如果多个配置文件中有相同类型的配置会优先级高的文件覆盖优先级的文件中的配置。如果配置项不同的话,所有的配置项都会生效。

关于其他的配置项,可以去SpringBoot官网上了解

打开查看附录中的Application Properties就可以获取到对应的配置项了,网址奉上:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

③常见配置项

在编写配置文件时,我们可以选择更关键的单词,idea会提示需要的配置项

1.配置数据源

# 配置Spring Boot应用的数据库源
spring:datasource:# 数据库连接URL,包含数据库的地址、端口、数据库名以及连接参数# 参数包括:useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC# 说明:使用Unicode编码,字符编码为UTF-8,不使用SSL,服务器时区为UTCurl: jdbc:mysql://localhost:3306/myd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC# 数据库用户名username: root# 数据库密码password: 123456# 数据库驱动类名driver-class-name: com.mysql.cj.jdbc.Driver# 数据源类型,这里使用的是阿里巴巴的Druid数据源type: com.alibaba.druid.pool.DruidDataSource

打datasource会更快出现需要的配置标签

2.关闭日志图标(banner)

spring:main:banner-mode: off

能够关闭运行日志中的此图标

3.设置运行日志的显示级别  

#日志配置
logging:level:root: infocom.myd: debug

能够显示数据库语句

④读取yaml和yml文件中的数据

1.读取单一数据

       yaml中保存的单个数据,可以使用Spring中的注解@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}

2.读取全部数据

       读取单一数据可以解决少量数据读取的问题,但是如果数据多的话,这样写会很麻烦,SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用自动装配注解可以将所有的yaml数据封装到这个对象中

3.读取对象数据

        首先定义一个对象,并将该对象纳入Spring管控的范围,也就是定义成一个bean,然后使用注解@ConfigurationProperties指定该对象加载哪一组yaml中配置的信息。

⑤多种环境开发(yaml单文件版)

        什么是多环境?其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样,这就是多环境。常见的多环境开发主要兼顾3种环境设置,开发环境——自己用的,测试环境——自己公司用的,生产环境——甲方爸爸用的。因为这是绝对不同的三台电脑,所以环境肯定有所不同,比如连接的数据库不一样,设置的访问端口不一样等等。

1.配置激活选项

spring:profiles:active: dev

2.在不同的配置环境下添加英文三个横杠(---)可以让idea区分不同的环境

spring:profiles:active: prod		# 启动prod
---
spring:profiles: prod
server:port: 8080
---
spring:profiles: dev
server:port: 8081
---
spring:profiles: test
server:port: 8082

四、logback记录日志

日志就是记录程序运行的信息,主要作用如下:

  1. 编程期调试代码
  2. 运营期记录信息
  3. 记录日常运营重要信息
  4. 记录应用报错信息
  5. 记录运维过程数据

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台

Logback继承自log4j。Logback的架构非常的通用,适用于不同的使用场景。

①logback初始化步骤

  1. logback会在类路径下寻找名为logback-test.xml的文件

  2. 如果没有找到,logback会继续寻找名为logback.groovy的文件

  3. 如果没有找到,logback会继续寻找名为logback.xml的文件

  4. 如果没有找到,将会在类路径下寻找文件META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了Configurator接口的实现类的全限定类名

  5. 如果以上都没有成功,logback会通过BasicConfigurator为自己进行配置,并且日志将会全部在控制台打印出来

②使用日志文件记录日志

1.导入依赖:spring-boot-starter-logging

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><version>2.5.2</version>
</dependency>

2.在配置文件中设置日志文件的名字

3.创建一个logback的配置文件logback.xml,日志输出到哪个目录的哪个文件下,输出的格式输出的日志级别

<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 输出到控制台 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 输出到文件 --><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>log/demo.log</file><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/demo.%d{yyyy-MM-dd}.log</fileNamePattern></rollingPolicy></appender><!-- 设置日志输出级别 --><root level="INFO"><appender-ref ref="console" /><appender-ref ref="file" /></root>
</configuration>

注意:

  1. spring boot默认会加载classpath:logback-spring.xml或者classpath:logback-spring.groovy或者:classpath:logback.xml
  2. 自定义配置文件(不要使用logback-logback.xml这个来命名,否则spring boot将不能完全实例化 ),文件格式为:
    logging: 
    config: classpath:logback-suke.xml

4.创建log对象去写日志,检测是否能够打印运行日志

import com.minyudie.spring_boot_basic1.pojo.Datasource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@Autowiredprivate Datasource datasource;private static final Logger logger =LoggerFactory.getLogger(TestController.class);@PostMapping("/hello")public String hello() {logger.info("I'm logger");return "hello";}}

使用apifox测试网址,使用post方法访问:

网址正确,访问成功!!!

控制台输出:

日志文件中成功记录到:

五、配置过滤器,拦截器,全局异常捕获

①使用SpringBoot的配置类来添加过滤器

1.编写Filter类

import jakarta.servlet.*;
import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter doFilter");}@Overridepublic void destroy() {Filter.super.destroy();}
}

2.使用SpringBoot提供的FilterRegistrationBean来对Filter进行配置

import com.minyudie.spring_boot_basic1.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilter(){FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new MyFilter());registrationBean.addUrlPatterns("/*");registrationBean.setName("myFilter");registrationBean.setOrder(1);return registrationBean;}
}

3.测试

成功执行!!

②配置拦截器

1.实现一个Intercepter类

这里我们需要实现HandlerInterceptor这个接口,这个接口包括三个方法,preHandle是请求执行前执行的,postHandler是请求结束执行的

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class MyIntercept implements HandlerInterceptor {private long start;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {start = System.currentTimeMillis();return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("耗时:" + (System.currentTimeMillis() - start));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

2.写一个配置类

import com.minyudie.spring_boot_basic1.intercept.MyIntercept;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class InterceptConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyIntercept()).addPathPatterns("/user");}
}

3.测试

没有出现hello,表示已被拦截

③设置全局捕获异常

1.创建一个异常类,在其class上注解@ControllerAdvice,在其方法上加上注解@ExceptionHandler(value=Exception.class)

import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class GlobleException {Logger logger = LoggerFactory.getLogger(GlobleException.class);@ExceptionHandler(value = Exception.class)@ResponseBodypublic String defaultErrorHandler(HttpServletRequest request, Exception e) {logger.error("请求地址:{},发生异常:{}", request.getRequestURL(), e.getMessage());return "页面无法加载";}
}

2.测试,做一个会让程序报错的动作,去查看是否会显示“页面无法加载”

例如:输入一个不存在的网址,查看是否会显示我们想要的结果

测试成功!!

注意:

       在测试之前,我们需要把过滤器的过滤文件路径改为不属于我们需要测试的这个路径,否则我们无法看到报错,只会有"MyFilter doFilter"。

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

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

相关文章

i18n-ai-translate开源程序,可以使用DeepSeek等模型将您的 i18nJSON翻译成任何语言

一、软件介绍 文末提供程序和源码下载 i18n-ai-translate开源程序使用 DeepSeek等模型可以将您的 i18n JSON 翻译成任何语言。 无缝翻译本地化文件。支持嵌套翻译文件的目录。需要i18next样式的JSON 文件&#xff08;文末一并提供下载&#xff09;。 二、模式 CSV 模式 三个…

Flask + ajax上传文件(一)--单文件上传

一、概述 本教程将教你如何使用Flask后端和AJAX前端实现文件上传功能,包含完整的代码实现和详细解释。 二、环境准备 1. 所需工具和库 Python 3.xFlask框架jQuery库Bootstrap(可选,用于美化界面)2. 安装Flask pip install flask三、项目结构 upload_project/ ├── a…

如何在 Postman 中,自动获取 Token 并将其赋值到环境变量

在 Postman 中&#xff0c;你可以通过 预请求脚本&#xff08;Pre-request Script&#xff09; 和 测试脚本&#xff08;Tests&#xff09; 实现自动获取 Token 并将其赋值到环境变量&#xff0c;下面是完整的操作步骤&#xff1a; ✅ 一、创建获取 Token 的请求 通常这个请求…

北斗导航 | 基于Transformer+LSTM+激光雷达的接收机自主完好性监测算法研究

基于Transformer+LSTM+激光雷达的接收机自主完好性监测算法研究 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)定位可靠性的核心技术。传统RAIM算法依赖最小二乘残差法,存在故障漏检、对复杂环境适应性差等问题。结合Transformer、LSTM与激光雷达的多模态融合…

基于Python爬虫的豆瓣电影信息爬取(可以根据选择电影编号得到需要的电影信息)

# 豆瓣电影信息爬虫(展示效果如下图所示:) 这是一个功能强大的豆瓣电影信息爬虫程序,可以获取豆瓣电影 Top 250 的详细信息。 ## 功能特点 - 自动爬取豆瓣电影 Top 250 的所有电影信息 - 支持分页获取,每页 25 部电影,共 10 页 - 获取每部电影的详细信息,包括: - 标题…

Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit

硬件环境 使用一块技嘉 B85m-DS3H 安装 P104-100, CPU是带集成显卡的i5-4690. 先在BIOS中设置好显示设备优先使用集成显卡(IGX). 然后安装P104-100开机. 登入Ubuntu 后查看硬件信息, 检查P104-100是否已经被检测到 # PCI设备 lspci -v | grep -i nvidia lspci | grep NVIDIA …

东南亚与中东小游戏市场出海调研报告

东南亚与中东小游戏市场出海调研报告 目标市场筛选与概况 (The Gaming Market in Southeast Asia (SEA) | Allcorrect)图:2018–2027年东南亚主要国家游戏市场收入(亿美元)趋势。到2024年东南亚游戏市场规模预计将接近300亿美元 (2024年东南亚手游市场怎么样? - 快出海问…

力扣4-最长公共前缀

一.题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

设计模式和单一原则笔记

单一原则&#xff1a;方法 对象 策略模式&#xff1a;方法实现 // 策略接口&#xff08;单一职责&#xff1a;定义计算规范&#xff09; public interface PriceStrategy {boolean match(String type); // 职责1&#xff1a;判断是否适用该策略double calculate(double pric…

常见正则表达式整理与Java使用正则表达式的例子

一、常见正则表达式整理 1. 基础验证类 邮箱地址 ^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\\.[a-zA-Z]{2,}$ &#xff08;匹配如 userexample.com&#xff09;手机号 ^1[3-9]\\\\d{9}$ &#xff08;匹配国内11位手机号&#xff0c;如 13812345678&#xff09;中文字符 ^[\u4e00-\u9fa5…

vue2 项目的 vscode 插件整理

Folder Selector 当项目文件很多时&#xff0c;查找一个文件&#xff0c;可能需要在资源管理器中不断的滚动再打开文件夹查找文件&#xff0c;很麻烦&#xff0c;这个可以增加一个面板通过右键文件夹选择 然后在面板中查看文件 Reveal Button 文件中跳转到另一个文件时&#…

使用 Node、Express 和 MongoDB 构建一个项目工程

本文将详细介绍如何使用 Node.js Express MongoDB 构建一个完整的 RESTful API 后端项目&#xff0c;涵盖&#xff1a; 项目初始化 Express 服务器搭建 MongoDB 数据库连接 REST API 设计&#xff08;CRUD 操作&#xff09; 错误处理与中间件 源码结构与完整代码 部署建…

如何实现Spring Boot应用程序的安全性:全面指南

在现代 Web 开发中&#xff0c;安全性是 Spring Boot 应用程序的核心需求&#xff0c;尤其是在微服务、云原生和公开 API 场景中。Spring Boot 结合 Spring Security 提供了一套强大的工具&#xff0c;用于保护应用程序免受常见威胁&#xff0c;如未经授权的访问、数据泄露、跨…

无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

电脑配置:Xavier-nx、ubuntu 18.04、ros melodic 激光雷达:Livox_Mid-360 结果展示:左边Mid360+Fast-lio感知建图,右边Ego-planner运动规划 1、读取雷达数据并显示 无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)-CSDN博客 看看雷达数据话题imu以及…

数据库证书可以选OCP认证吗?

直接回答&#xff1a;国内OCP认证持有者的年薪普遍在15万到40万元之间&#xff0c;具体收入与经验、地区和行业强相关。OCP认证能大幅提升求职竞争力&#xff0c;但薪资天花板仍由个人能力决定。 一、薪资范围和核心影响因素 OCP认证是Oracle数据库领域的中高级“技术通行证”…

MySQL 从入门到精通:第二篇 - 数据类型、约束与索引

1. MySQL数据类型详解 数值类型 整数类型 -- 常用整数类型及范围 CREATE TABLE integer_types (tiny_col TINYINT, -- 1字节,有符号(-128~127),无符号(0~255)small_col SMALLINT, -- 2字节,有符号(-32768~32767),无符号(0~65535)medium_col MEDIUMINT,

Arduino 入门学习笔记(二):开发环境搭建

Arduino 入门学习笔记&#xff08;二&#xff09;&#xff1a;开发环境搭建 B站学习链接&#xff1a;link 1. Arduino IDE2软件介绍 Arduino IDE&#xff0c;Arduino Integrated Development Environment&#xff0c;即Arduino集成开发环境。 Arduino IDE具有程序编辑、调试…

ChatGPT、deepseek、豆包、Kimi、通义千问、腾讯元宝、文心一言、智谱清言代码能力对比

均使用测试时的最强模型 均是一次对话,对话内容一样 均开启深度思考 能联网的都联网了&#xff0c;但是作用不大&#xff0c;因为蓝桥杯刚考完&#xff0c;洛谷题目刚上传没多久 问题一测试了两遍 从问题三开始不再测试智谱清言&#xff08;它思考时间太长了&#xff0c;前两个…

OCR之身份证识别

前言 OCR身份证识别是光学字符识别技术在身份证领域的应用。通过扫描或拍照获取身份证图像&#xff0c;利用图像处理、深度学习等技术&#xff0c;自动提取姓名、性别、民族、出生日期、地址、身份证号等信息&#xff0c;可大幅提升信息录入效率&#xff0c;广泛应用于政务、金…

线性代数—向量与矩阵的范数(Norm)

参考链接&#xff1a; 范数&#xff08;Norm&#xff09;——定义、原理、分类、作用与应用 - 知乎 带你秒懂向量与矩阵的范数(Norm)_矩阵norm-CSDN博客 什么是范数&#xff08;norm&#xff09;&#xff1f;以及L1,L2范数的简单介绍_l1 norm-CSDN博客 范数&#xff08;Norm…