当前位置: 首页 > news >正文

14个SpringBoot优化小妙招

今天我们来分享一下平时用SpringBoot开发时候的一些优化小妙招,用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅,让我们每个人手头负责的代码和工程都要很漂亮~~~

这里的优化小妙招很多不是说直接对springboot来优化,有些是对springboot自己的优雅特性做一些总结,帮助大家更加系统全面的了解springboot开发的时候,如何做可以让我们的代码和系统更加的优雅。

当然,因为要分享的优化小妙招很多,我们更多的是给大家展示一下优化的一些点和思路,具体的使用大家如果要落地,还得自己查阅官网资料!

1. 使用@SpringBootApplication注解简化配置

SpringBoot提倡“约定大于配置”,而@SpringBootApplication注解正是这一理念的体现。它集成了@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解,让你的主类配置瞬间简洁明了。

说实话,一般来说我们都是用springboot来开发系统的时候,都是默认都加@SpringBootApplication注解的,这个倒不能说是优化小妙招,更多的是给大家引入一下这个注解,我们可以学习一下springboot框架这种优雅的设计理念。

也就是说,SpringBoot为了尽最大可能去简化一个web系统的启动,设计了SpringApplication启动类一键启动一个web系统,所有的web server、spring容器、bean管理、三方组件管理、扩展组件管理,其实都是默认行为去管控的,最大简化我们的系统开发,搭配上一些注解的使用,就从头开始就让我们的系统非常优雅!

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


2. 利用配置文件简化代码

SpringBoot支持多种格式的配置文件,如application.properties和application.yml。你可以将一些配置信息放在这里,减少硬编码,让代码更加灵活。

这个说实话一般人用springboot开发系统也都是加配置文件的,毕竟配置信息不要写死在代码里,把配置信息放外部配置文件,这样才能优雅,而且一般还可以搭配springboot的profile功能把不同环境的配置文件区分开来,部署的时候指定一个环境就可以了。

# application.yml
server:
port: 8080
my:
greeting: Hello, World!@Value("${my.greeting}")
private String greeting;


3. 使用Actuator监控应用

SpringBoot Actuator提供了很多内置的端点,让你能够监控和管理应用。比如/health端点可以告诉你应用的健康状态,/metrics端点则提供了各种度量信息。

这个其实就是系统上线以后我们是需要对系统进行监控的,那一般小公司没有大公司完善的基础设施,如果我们要快速开发和部署一个系统上线,其实可以直接用springboot自带的监控功能来对线上系统进行基础的监控。

<!-- 在pom.xml中添加Actuator依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


4. 异步处理提升性能

SpringBoot支持异步处理,你可以使用@Async注解来异步执行方法,提升应用的性能和响应速度,这个是一个好功能,如果执行异步功能,一般我们都要自己开线程去执行异步任务,但是用异步注解可以由框架启动一个内嵌的异步任务执行我们的代码逻辑,这个相当优雅,有没有?代码是不是很漂亮!

@Service
public class AsyncService {@Asyncpublic void executeAsyncTask() {// 执行异步任务}
}


5. 利用缓存减少数据库访问

SpringBoot支持多种缓存抽象,如ConcurrentMap、EhCache、Redis等。使用缓存可以减少对数据库的访问,提高应用的性能。以前咱们用缓存的时候,那肯定是要自己封装缓存组件的,完了在封装好的缓存组件里基于开源的缓存系统的客户端来实现各类功能,对吧,然后再代码里是不是我们还得自己动手编写缓存读写的代码逻辑?

好,那现在我们可以用@CacheConfig、@Cacheable等注解直接让框架去托管缓存的读写,自动把数据库查询结果进行缓存,以及下次查找的时候自动读取缓存,是不是感觉很方便?就省去了自己写缓存读写代码的过程了,又变得优雅了有没有~~~

@Service
@CacheConfig(cacheNames = "books")
public class BookService {@Cacheablepublic Book findBook(ISBN isbn) {// 模拟耗时操作return findBookFromDatabase(isbn);}
}


6. 使用JPA简化数据库操作

SpringBoot与Spring Data JPA结合,可以让你用非常简洁的代码完成复杂的数据库操作。咱们平时要是封装数据库操作,是不是得自己动手搞?那现在直接用Spring Data JPA来做数据库操作的ORM,是不是感觉方便了很多?

以前我们得自己写sql语句,自己做数据的增删改查,现在都是面向对象编写数据库操作逻辑,框架底层自动托管生成sql语句去做数据库的增删改查,是不是很优雅很方便?

public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByAuthor(String author);
}


7. 优化RESTful API设计

RESTful API的设计应该简洁、直观。使用SpringBoot,你可以很容易地创建RESTful API,并使用Swagger等工具进行文档生成和测试。这个功能实在是太常用了,没用springboot的时候,其实咱们还得自己整合ssm框架,完了去用springmvc开发web接口,现在用了springboot以后,内嵌就帮我们搞定了spring和springmvc的框架整合这些事情,直接上手编写web接口,一键启动启动就可以对外提供http接口了,很方便有没有~~~

@RestController
@RequestMapping("/books")
public class BookController {@GetMapping("/{id}")public ResponseEntity<Book> getBook(@PathVariable Long id) {// 获取书籍并返回}
}


8. 使用Spring Security保护应用

SpringBoot与Spring Security的结合,可以让你轻松地保护你的应用。你可以配置用户、角色、权限等,还可以使用OAuth2、JWT等高级特性。所谓的安全性保护,说白了就是我们写好的系统发布上线了,不能随便谁都可以来调用接口吧?不能随便谁来提交数据我们都允许修改系统数据库里的数据吧?不能随便谁来查询数据我们都开放给他查询吧?

那是不是得有一套安全防护机制?比如说限制一下哪些http接口路径要进行防护,我们防护的时候是怎么防护,是不是说要求请求方必须携带用户token信息,然后是不是要对请求里带的token信息进行有效校验、权限校验?必须是我们允许的用户携带了有效的校验信息,我们才可以允许他来请求系统,是不是?

那所以这块是不是可以跟spring security框架整合,直接把防护性功能给做了?

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated().and().formLogin().and().logout();}
}


9. 利用Lombok简化模型类

Lombok是一个Java库,它可以自动插入编辑器并构建工具,简化Java模型类的编写。使用Lombok,你可以省去getter、setter、构造器等方法的编写。这个lombok框架还是很方便的,因为我们有了他,就不用动手写一大堆的冗余方法了,让我们的代码更加简洁明了,domain领域对象可以专注自己的属性就可以了。

@Data
public class Book {private Long id;private String title;private String author;
}


10. 使用MapStruct处理对象映射

MapStruct是一个代码生成器,它基于约定优于配置的原则,可以在Java bean类型之间自动实现映射。使用MapStruct,你可以避免手动编写繁琐的映射代码。这个框架也是相当的有用,我们如果要是在一些VO、DO、DTO等对象之间进行对象转换,不用自己动手封装转换逻辑了,直接用这个框架就可以实现对象转换了,很优雅有么有~~~

@Mapper
public interface BookMapper {BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);BookDto toDto(Book entity);Book toEntity(BookDto dto);
}


11. 使用Spring Boot Admin监控多个应用

Spring Boot Admin是一个开源社区项目,用于管理和监控基于Spring Boot的应用。它可以显示应用的健康状态、度量信息、环境属性等。这个就跟我们上面说的一样,springboot快速开发一个系统然后发布上线,咱们肯定要监控,除了springboot内嵌的监控机制以外,还可以用springboot admin来进行更加完善的监控。

<!-- 在pom.xml中添加Spring Boot Admin Client依赖 -->
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>


12. 使用Spring Cloud构建微服务

SpringBoot与Spring Cloud的结合,可以让你轻松地构建微服务架构的应用。Spring Cloud提供了服务发现、配置中心、消息总线、负载均衡等微服务所需的组件。如果我们开发的系统要拆分多个子系统,或者是多个服务,引入多人团队来协作开发,那肯定会引入微服务框架,要不然用springcloud原生技术栈,要不然用springcloud alibaba技术栈,这块都是可以让我们的系统变得更好,对不对?

@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceApplication {public static void main(String[] args) {SpringApplication.run(MicroserviceApplication.class, args);}
}


13. 使用Spring Boot Test进行集成测试

SpringBoot提供了强大的测试支持,你可以使用@SpringBootTest注解来进行集成测试,还可以使用@MockBean、@SpyBean等注解来模拟依赖。这个其实很有用,因为我们平时写好了代码以后要进行测试,一般就是单元测试、冒烟测试、集成测试、验收测试等,那其实用springboot test框架可以更加方便的帮助我们进行各类代码测试。

@SpringBootTest
public class BookServiceTests {@Autowiredprivate BookService bookService;@Testpublic void testFindBook() {Book book = bookService.findBook("1234567890");assertNotNull(book);assertEquals("Spring Boot in Action", book.getTitle());}
}


14. 使用Docker容器化部署

SpringBoot应用可以很容易地容器化部署,使用Docker可以让你的应用在任何支持Docker的平台上运行。这个容器部署其实是现在非常流行的一种部署方式,说白了就是我们的系统每次部署 一般都要设置各种参数,可能还要携带各种配置,或者相关的一些其他东西,那其实如果每次部署多加一台机器都要在机器里重新进行环境配置等繁琐操作,现在我们可以把这个工程和依赖的其他东西做成一个docker镜像。

然后线上部署的时候再新的机器上直接安装docker环境,基于我们的docker镜像就可以一键部署系统了,是不是?相当的方便!

# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

总结

以上就是14个SpringBoot相关的优化小妙招,希望它们能让你的代码不仅跑得快,还写得像首诗一样美。SpringBoot的强大之处不仅仅在于它的简洁和易用,更在于它背后的一套完整的生态体系。掌握这些优化技巧,你将能更加高效地开发SpringBoot应用,享受编码的乐趣。

来源: 石杉的架构笔记
  

相关文章:

14个SpringBoot优化小妙招

今天我们来分享一下平时用SpringBoot开发时候的一些优化小妙招&#xff0c;用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅&#xff0c;让我们每个人手头负责的代码和工程都要很漂亮~~~ 这里的优化小妙招很多不是说直…...

Elasticsearch 度量(Metric)聚合详解及示例

Elasticsearch 提供了强大的聚合功能&#xff0c;允许用户对数据进行深入的统计分析。度量&#xff08;Metric&#xff09;聚合是其中一种&#xff0c;它用于对数值型数据进行计算&#xff0c;如求和、平均值、最大值、最小值等。本文将详细介绍 Elasticsearch 的度量聚合&…...

基于 jsp 的健身俱乐部会员系统设计与实现

点击下载源码 基于 jsp 的健身俱乐部会员系统设计与实现 摘 要 目前我国虽然己经开发出了应用计算机操作的健身俱乐部管理系统&#xff0c;但管理软件&#xff0c;管理方法和管理思想三者往往相脱节。造成我国健身俱乐部信息管理系统极端化的缺陷。在国外健身俱乐部已经有了一…...

苍穹外卖项目DAY01

苍穹外卖项目Day01 1、软件开发整体介绍 1.1、软件开发流程 1.2、角色分工 项目经理&#xff1a;对整个项目负责&#xff0c;任务分配、把控进度产品经理&#xff1a;进行需求调研&#xff0c;输出需求调研文档、产品原型等UI设计师&#xff1a;根据产品原型输出界面效果图架…...

SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理+约定大于配置

前言 如果SSM学的比较好&#xff0c;那么SpringBoot说白了就两件事:约定大于配置和自动装配 SpringBoot不会提供任何的功能拓展&#xff0c;完全依赖我们手动添加 所以SpringBoot的本质是一个依赖脚手架&#xff0c;可以快速集成配置各种依赖 1.1 SpringBoot相关依赖 创建…...

[Unity]关闭URP的SRP,开启GPU Instancing。

1. 对应材质的gpu instancing勾选上。 2. 游戏初始化时动态关闭SRP&#xff0c;或者在Graphics里全局关闭。动态关闭的代码如下&#xff1a; GraphicsSettings.useScriptableRenderPipelineBatching false; 模型合批的一些规则&#xff1a; 1. 模型一致。 2. 材质一致。 …...

04创建型设计模式——建造者模式

一、建造者模式简介 建造者模式&#xff08;Builder Pattern&#xff09;又被称为生成器模式。它旨在构建一个复杂对象的各个部分&#xff0c;而不需要指定该对象的具体类。该模式特别适用于对象的构建过程复杂且需要多个步骤的情况。建造者模式是一种对象创建型模式之一&…...

前端开发中的代码规范

引言 在前端开发中&#xff0c;遵循良好的代码规范是非常重要的。这不仅能提高代码的可读性和可维护性&#xff0c;还能帮助团队成员更好地协作。本文将介绍一些前端开发中常用的代码规范&#xff0c;并探讨它们的重要性。 1. 代码规范的重要性 1.1 可读性 良好的代码规范可…...

WHAT - 远程控制机制

目录 1. 客户端-服务器架构2. 连接建立3. 数据传输4. 通信协议5. 安全性6. 远程控制软件示例7. 操作流程示例 远程控制别人的电脑涉及到技术和安全多个方面。其基本机制通常包括以下几个方面&#xff1a; 1. 客户端-服务器架构 远程控制软件通常采用客户端-服务器架构&#x…...

苹果手机录音功能在哪里?3招轻松打开手机录音

无论是记录重要的会议内容、捕捉生活中的美好瞬间&#xff0c;还是进行语言学习&#xff0c;苹果手机的录音功能都能提供极大的便利。那么&#xff0c;苹果手机录音功能在哪里呢&#xff1f;本文将为您揭示苹果手机录音功能的藏身之处&#xff0c;并通过3个简单步骤&#xff0c…...

RCE之突破长度限制

我们在写webshell时通常会遇到过滤&#xff0c;但除了过滤之外还可能会有长度限制&#xff0c;这里就简单说一下关于RCE突破长度限制的技巧 突破16位 例如&#xff1a;PHP Eval函数参数限制在16个字符的情况下 &#xff0c;如何拿到Webshell&#xff1f; <?php $param …...

Arduino控制带编码器的直流电机速度

Arduino DC Motor Speed Control with Encoder, Arduino DC Motor Encoder 作者 How to control dc motor with encoder:DC Motor with Encoder Arduino, Circuit Diagram:Driving the Motor with Encoder and Arduino:Control DC motor using Encoder feedback loop: How …...

LangChain与Elasticsearch向量数据库的完美结合

在过去的一年中&#xff0c;生成式 AI (Generative AI) 领域取得了显著的进展。许多新的服务和工具应运而生。其中&#xff0c;LangChain 已成为构建大语言模型 (LLM) 应用程序&#xff08;例如检索增强生成 (RAG) 系统&#xff09;最受欢迎的框架之一。该框架极大地简化了原型…...

element时间段选择器或时间选择器 只设置默认起始时间或者结束时间,不显示问题

element时间段选择器或时间选择器 只设置默认起始时间或者结束时间&#xff0c;不显示问题 <div v-for"(item,index) in [a,b]":key"item"><el-date-pickerv-if"b"v-model"value1[item]"type"datetimerange"value-…...

Vue 3 中,组件间传值有多种方式

在 Vue 3 中&#xff0c;组件间传值有多种方式&#xff0c;以下是几种常见的方式 父组件向子组件传值&#xff08;通过 props&#xff09;&#xff1a;以下是几个父组件向子组件传值的示例&#xff1a;示例 1&#xff1a;传递字符串示例 2&#xff1a;传递数字示例 3&#xff1…...

前置(3):npm 和npx异同点

npm&#xff08;Node Package Manager&#xff09;和npx&#xff08;Node Package Execute&#xff09;是两个密切相关但用途不同的命令行工具&#xff0c;它们都是Node.js生态系统中的重要组成部分。 npm 用途&#xff1a;npm是Node.js的包管理器&#xff0c;主要用于安装、…...

笔记(day17)集合概述、List、Set、比较器

集合Collection 一.概述 ​ 集合可以理解为数据结构的封装,根据不同的特性及操作性能进行分类 二.继承体系 三.Collection中常用方法 ​ collection是集合中的父类,所以collection中的方法是所有集合中都有的 ​ 集合中只能保存引用类型(Object),无法保存基本类型 ​ Colle…...

C语言从头学45——I/O函数(二)

本文继续学习I/O函数&#xff0c;并延续前文的编号。 (三)、sscanf() 函数 sscanf() 函数与scanf() 有些相似&#xff0c;不同之处sscanf() 是从已有的字符串里面获取数据&#xff1b;这个函数也是定义在stdio.h中。 功能&#xff1a;处理已经输入到计算机中的字…...

Python爬虫——爬取bilibili中的视频

爬取bilibili中的视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到…...

为什么企业电销要用外呼系统

电销要使用外呼系统的原因主要有以下几点&#xff1a; 一、提升工作效率 * **自动拨号**&#xff1a;外呼系统能够自动拨打客户电话&#xff0c;减少电销人员手动拨号的时间&#xff0c;让他们将更多精力集中在与客户的沟通和交流上。 * **数据记录与管理**&#xff1a;系统能…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

【大厂机试题解法笔记】矩阵匹配

题目 从一个 N * M&#xff08;N ≤ M&#xff09;的矩阵中选出 N 个数&#xff0c;任意两个数字不能在同一行或同一列&#xff0c;求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求&#xff1a;1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...

RFID推动新能源汽车零部件生产系统管理应用案例

RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域&#xff0c;电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式&#xff0c;存在单点位单独头溯源、网关布线…...