@Java 开发者,Spring Boot 最流行的 16 条实践解读!

Spring、Struts、Laravel、ThinkPHP四大框架高危漏洞复现与防御实战 在Web应用开发中,Spring、Struts、Laravel、ThinkPHP等主流框架极大地提升了开发效率,但其标准化特性也引入了共性的安全风险。框架漏洞的根源往往在于核心机制的设计缺陷,例如表达式注入、数据绑定、配置不当等。理解这些漏洞原理,不仅能帮助开发者编写更健壮的代码,更是渗透测试和应急响应中快速定位风险的关键。从技术价值看,掌握框架漏洞的攻防视角,可以实现从庞大的业务代码审计收敛到框架本身攻击面,大幅提升安全评估效率。在应用场景上,无论是甲方安全工程师进行风险评估,还是乙方进行授权渗透测试,都 阅读详情

在这里插入图片描述

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。

在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于Spring项目)。以下依次列出了最佳实践,排名不分先后。

使用自定义BOM来维护第三方依赖

这条实践是我根据实际项目中的经历总结出的。

Spring Boot项目本身使用和集成了大量的开源项目,它帮助我们维护了这些第三方依赖。但是也有一部分在实际项目使用中并没有包括进来,这就需要我们在项目中自己维护版本。如果在一个大型的项目中,包括了很多未开发模块,那么维护起来就非常的繁琐。

怎么办呢?事实上,Spring IO Platform就是做的这个事情,它本身就是Spring Boot的子项目,同时维护了其他第三方开源库。我们可以借鉴Spring IO Platform来编写自己的基础项目platform-bom,所有的业务模块项目应该以BOM的方式引入。这样在升级第三方依赖时,就只需要升级这一个依赖的版本而已。

<dependencyManagement>
 <dependencies>
 <dependency>
 <groupId>io.spring.platform</groupId>
 <artifactId>platform-bom</artifactId>
 <version>Cairo-SR3</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 </dependencies>
</dependencyManagement>

使用自动配置

Spring Boot的一个主要特性是使用自动配置。这是Spring Boot的一部分,它可以简化你的代码并使之工作。当在类路径上检测到特定的jar文件时,自动配置就会被激活。

使用它的最简单方法是依赖Spring Boot Starters。因此,如果你想与Redis进行集成,你可以首先包括:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果你想与MongoDB进行集成,需要这样:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

借助于这些starters,这些繁琐的配置就可以很好地集成起来并协同工作,而且它们都是经过测试和验证的。这非常有助于避免可怕的Jar地狱(https://dzone.com/articles/what-is-jar-hell)。

通过使用以下注解属性,可以从自动配置中排除某些配置类:

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})
但只有在绝对必要时才应该这样做。

有关自动配置的官方文档可在此处找到:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html。

使用Spring Initializr来开始一个新的Spring Boot项目

这一条最佳实践来自Josh Long (Spring Advocate,@starbuxman)。

Spring Initializr(https://start.spring.io/)提供了一个超级简单的方法来创建一个新的Spring Boot项目,并根据你的需要来加载可能使用到的依赖。

使用Initializr创建应用程序可确保你获得经过测试和验证的依赖项,这些依赖项适用于Spring自动配置。你甚至可能会发现一些新的集成,但你可能并没有意识到这些。

考虑为常见的组织问题创建自己的自动配置

这一条也来自Josh Long(Spring Advocate,@starbuxman)——这个实践是针对高级用户的。

如果你在一个严重依赖Spring Boot的公司或团队中工作,并且有共同的问题需要解决,那么你可以创建自己的自动配置。

这项任务涉及较多工作,因此你需要考虑何时获益是值得投入的。与多个略有不同的定制配置相比,维护单个自动配置更容易。

如果将这个提供Spring Boot配置以开源库的形式发布出去,那么将极大地简化数千个用户的配置工作。

正确设计代码目录结构

尽管允许你有很大的自由,但是有一些基本规则值得遵守来设计你的源代码结构。

避免使用默认包。确保所有内容(包括你的入口点)都位于一个名称很好的包中,这样就可以避免与装配和组件扫描相关的意外情况;
将Application.java(应用的入口类)保留在顶级源代码目录中;
我建议将控制器和服务放在以功能为导向的模块中,但这是可选的。一些非常好的开发人员建议将所有控制器放在一起。不论怎样,坚持一种风格!

保持@Controller的简洁和专注

Controller应该非常简单。你可以在此处阅读有关GRASP中有关控制器模式部分的说明(https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Controller)。你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。以下是主要做法:

控制器应该是无状态的!默认情况下,控制器是单例,并且任何状态都可能导致大量问题;
控制器不应该执行业务逻辑,而是依赖委托;
控制器应该处理应用程序的HTTP层,这不应该传递给服务;
控制器应该围绕用例/业务能力来设计。
要深入这个内容,需要进一步地了解设计REST API的最佳实践。无论你是否想要使用Spring Boot,都是值得学习的。

围绕业务功能构建@Service

Service是Spring Boot的另一个核心概念。我发现最好围绕业务功能/领域/用例(无论你怎么称呼都行)来构建服务。

在应用中设计名称类似AccountService, UserService, PaymentService这样的服务,比起像DatabaseService、ValidationService、CalculationService这样的会更合适一些。

你可以决定使用Controler和Service之间的一对一映射,那将是理想的情况。但这并不意味着,Service之间不能互相调用!

使数据库独立于核心业务逻辑之外

我之前还不确定如何在Spring Boot中最好地处理数据库交互。在阅读了罗伯特·C·马丁的“Clear Architecture”之后,对我来说就清晰多了。

你希望你的数据库逻辑于服务分离出来。理想情况下,你不希望服务知道它正在与哪个数据库通信,这需要一些抽象来封装对象的持久性。

罗伯特C.马丁强烈地说明,你的数据库是一个“细节”,这意味着不将你的应用程序与特定数据库耦合。过去很少有人会切换数据库,我注意到,使用Spring Boot和现代微服务开发会让事情变得更快。

保持业务逻辑不受Spring Boot代码的影响

考虑到“Clear Architecture”的教训,你还应该保护你的业务逻辑。将各种Spring Boot代码混合在一起是非常诱人的……不要这样做。如果你能抵制诱惑,你将保持你的业务逻辑可重用。

部分服务通常成为库。如果不从代码中删除大量Spring注解,则更容易创建。

推荐使用构造函数注入

这一条实践来自Phil Webb(Spring Boot的项目负责人, @phillip_webb)。

保持业务逻辑免受Spring Boot代码侵入的一种方法是使用构造函数注入。 不仅是因为@Autowired注解在构造函数上是可选的,而且还可以在没有Spring的情况下轻松实例化bean。

熟悉并发模型

我写过的最受欢迎的文章之一是“介绍Spring Boot中的并发”(https://www.e4developer.com/2018/03/30/introduction-to-concurrency-in-spring-boot/)。我认为这样做的原因是这个领域经常被误解和忽视。如果使用不当,就会出现问题。

在Spring Boot中,Controller和Service是默认是单例。如果你不小心,这会引入可能的并发问题。 你通常也在处理有限的线程池。请熟悉这些概念。

如果你正在使用新的WebFlux风格的Spring Boot应用程序,我已经解释了它在“Spring’s WebFlux/Reactor Parallelism and Backpressure”中是如何工作的。

加强配置管理的外部化

这一点超出了Spring Boot,虽然这是人们开始创建多个类似服务时常见的问题……

你可以手动处理Spring应用程序的配置。如果你正在处理多个Spring Boot应用程序,则需要使配置管理能力更加强大。

我推荐两种主要方法:

使用配置服务器,例如Spring Cloud Config;
将所有配置存储在环境变量中(可以基于git仓库进行配置)。
这些选项中的任何一个(第二个选项多一些)都要求你在DevOps更少工作量,但这在微服务领域是很常见的。

提供全局异常处理

你真的需要一种处理异常的一致方法。Spring Boot提供了两种主要方法:

你应该使用HandlerExceptionResolver定义全局异常处理策略;
你也可以在控制器上添加@ExceptionHandler注解,这在某些特定场景下使用可能会很有用。
这与Spring中的几乎相同,并且Baeldung有一篇关于REST与Spring的错误处理的详细文章(https://www.baeldung.com/exception-handling-for-rest-with-spring),非常值得一读。

使用日志框架

你可能已经意识到这一点,但你应该使用Logger进行日志记录,而不是使用System.out.println()手动执行。这很容易在Spring Boot中完成,几乎没有配置。只需获取该类的记录器实例:

Logger logger = LoggerFactory.getLogger(MyClass.class);
这很重要,因为它可以让你根据需要设置不同的日志记录级别。

测试你的代码

这不是Spring Boot特有的,但它需要提醒——测试你的代码!如果你没有编写测试,那么你将从一开始就编写遗留代码。

如果有其他人使用你的代码库,那边改变任何东西将会变得危险。当你有多个服务相互依赖时,这甚至可能更具风险。

由于存在Spring Boot最佳实践,因此你应该考虑将Spring Cloud Contract用于你的消费者驱动契约,它将使你与其他服务的集成更容易使用。

使用测试切片让测试更容易,并且更专注

这一条实践来自Madhura Bhave(Spring 开发者, @madhurabhave23)。

使用Spring Boot测试代码可能很棘手——你需要初始化数据层,连接大量服务,模拟事物……实际上并不是那么难!答案是使用测试切片。

使用测试切片,你可以根据需要仅连接部分应用程序。这可以为你节省大量时间,并确保你的测试不会与未使用的内容相关联。来自spring.io的一篇名为Custom test slice with Spring test 1.4的博客文章(https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4)解释了这种技术。

总结

感谢Spring Boot,编写基于Spring的微服务正变得前所未有的简单。我希望通过这些最佳实践,你的实施过程不仅会变得很快,而且从长远来看也会更加强大和成功。祝你好运!

喜欢小编轻轻点个关注哦!

主流开发框架安全漏洞深度解析与实战防御指南 在软件开发领域,开发框架安全是保障应用稳定运行的基石。其核心原理在于,框架通过封装通用功能提升开发效率,但默认配置或设计缺陷可能引入攻击面。理解框架安全机制的技术价值在于,能主动规避因配置不当或组件漏洞导致的数据泄露、服务中断等风险。常见的应用场景包括Web应用、微服务架构及企业级系统。本文聚焦于ThinkPHP、Laravel、SpringBoot等主流框架,通过复现远程代码执行(RCE)和配置泄露等典型漏洞,深入剖析其成因与利用方式,并提供从环境搭建到企业级加固的完整解决方案,帮助开发者构建安全防线。 阅读详情

相关推荐

Mythos如何实现安全AI的认知跃迁:从漏洞生成到系统理解

大模型在网络安全中的应用正从‘模式匹配’迈向‘系统级认知’。传统安全AI依赖提示工程和规则检索,而新一代模型如Mythos通过建模软件依赖图谱、跨模块状态维持与隐式约束推理,实现了对攻击链因果结构的深层理解。其核心突破在于将安全能力内化为底层认知表征,而非外挂工具链——这依赖动态稀疏MoE架构、对抗性蒸馏训练与Scaffolded Chain-of-Verification推理协议。技术价值体现在长程依赖建模衰减率降至3.7%、0day发现准确率提升至92%、真实环境exploit一次成功率超91%。典型应

weixin_30443747的博客 314

Spring-Boot-Devtools 热部署源码详解 与 双亲委派机制(单步源码级分析)

** 经常研究源码的朋友,想必对SpingBoot的run方法非常的熟悉了,但各位有没有发现,如果自己DEBUG源码,有一个地方会莫名的断开,程序直接往下走呢? ** 仔细研究会发现,这两步其实已经不是同一个线程了: 图一,线程名称为“main” 图二,线程名称为"restartedMain" 其实到这里相信一些初学java的读者还是蒙的,一开始我甚至以为是ide有问题,为什么A线程(用户开启的"main"线程)会凭空消失,而B线程又会凭空的在下一步出现呢?接下来我们不妨进入这个starting()方

cxlswh的博客 1056

SonarQube 7.9 部署与实战避坑指南:兼容JDK8/PostgreSQL11的稳定方案

SonarQube 是广泛使用的静态代码分析平台,其 LTS 版本在企业遗留系统治理中仍具不可替代性。理解 SonarQube 的架构原理(如嵌入式 vs 外部数据库、扫描器协议与 Web UI 分离机制),有助于评估技术选型边界与升级成本。SonarQube 7.9 凭借对 JDK 8、PostgreSQL 11 和 Maven 3.5.x 的原生支持,成为老旧 Java/JS 单体项目质量门禁落地的务实选择;它虽不支持 ES2022 语法或 record 类型,却能稳定集成 ESLint 报告、适配 P

weixin_33908217的博客 392

22条 Spring Boot 最佳实践,yyds!

Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。以下是一些最佳实践和一些技巧,我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。这篇文章会有点长,完整读完文章需要一些时间。1.正确的包目录风格正确的包目录将有助于轻松理解代码和应用程序的流程。我们可以使用有意义的包目录来构建我们的应用程序。我们可以将所有控制器包含在单独的包中,将服务包含在单独的包中,将 u...

架构文摘 270

傅里叶光学(1)

傅里叶光学,可以看作是通信理论中傅里叶变换等一系列数学思想以及系统理论与光学(主要是衍射光学)相结合的产物关于傅里叶光学的应用领域,本节介绍了成像,当然事实上不可能仅限于成像,经典的还如激光散斑的一些应用,干涉计量,还有傅里叶变换光谱学等等。最后总结一下,傅里叶光学我认为可以看做一个工具,对于任意的系统,它能给出一些数学思想与物理原理进行解释和分析,找出系统的扰动和响应的关系,或者说根据扰动和响应,来研究或者设计一个系统。

m0_53607446的博客 1685

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 502

SpringBoot 生产中 16 条最佳实践

Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记!Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于S...

HollisChuang's Blog 557

避坑指南:STM32移植CanFestival时那些没人告诉你的细节(含TJA1050硬件适配)

本文深入解析STM32移植CanFestival协议栈时的关键细节与TJA1050硬件适配技巧,涵盖AVR残留代码清理、定时器中断优化及CAN通信稳定性提升方案。特别针对TJA1050在特定波特率下的信号畸变问题提供实战解决方案,帮助开发者规避移植过程中的隐形陷阱,实现工业级稳定通信。

work3的博客 762

springboot使用logback日志框架超详细教程

前言        项目中日志系统是必不可少的,目前比较流行的日志框架有log4j、logback等,可能大家还不知道,这两个框架的作者是同一个人,Logback旨在作为流行的log4j项目的后续版本,从而恢复log4j离开的位置。另外 slf4j(Simple Logging Facade for Java) 则是一个日志门面框架,提供了日志系统中常用的接口,logback 和 log4j 则...

white_ice的博客 6万+

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析

本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。

weixin_28698059的博客 253

卡尔曼滤波、互补滤波与Tsinghua滤波:平衡车姿态感知的三大算法对比

本文对比了平衡车姿态感知中的卡尔曼滤波、互补滤波与Tsinghua滤波三大核心算法。互补滤波计算简单,适合入门;卡尔曼滤波理论最优但实现复杂;Tsinghua滤波则是一种面向嵌入式优化的轻量级方案,通过动态权重调整和零偏估计,在资源受限的MCU上实现了性能与效率的平衡,是智能车竞赛等场景的实用选择。

weixin_29232121的博客 349

@Java 开发者,Spring Boot 最流行的 16 条实践解读! 侵立删

转自:https://www.e4developer.com/2018/08/06/spring-boot-best-practices/   Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。 在本文中,我将重点...

心神沫沫的收藏 169

华为OD机试 新系统真题 【数字系统转换器】

华为OD机试 新系统真题【数字系统转换器】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【数字系统转换器】多语言题解。

qq_45776114的博客 542

行走的Offer收割机,首次公布Java10W字面经,Github访问量破百万

面试,难还是不难?最终结果好还是不好?取决于面试者的底蕴(气场+技能)、心态和认知以及沟通技巧。而一些主流的大型互联网公司面试(阿里巴巴、京东、美团、滴滴)更是需要你在面试时展现出自己的能力,从而获得面试官的欣赏和肯定。 但是面试的时候,当那个笑眯眯的面试官问出那些你再熟悉不过的问题 Java 问题时,你只是感觉似曾相识,却怎么也回答不到点上。比如 HashMap 的工作原理,再或者说 volatile 的使用场景。 这个时候,你可能会怀疑自己的能力,也痛恨为什么当初自己没有好好复习。 Jav

qq_64513388的博客 309

北斗导航 | 2023 PTTI会议论文 2023 ITM会议论文 2022 ION GNSS+ 会议论文下载:ION 美国导航学会

2023 国际技术会议(ITM) 2023 精密时间和时间间隔系统和应用会议(PTTI) 2022 美国导航学会国际会议(ION GNSS +)

尘世冰封的专栏 4615

基于Simulink的单级式光伏并网系统MPPT控制仿真

本文基于Simulink平台,详细介绍了单级式光伏并网系统的MPPT控制仿真实现。主要内容包括:1)阐述MPPT作为光伏系统"智能大脑"的核心作用;2)解析单级式系统架构及扰动观察法(P&O)算法原理;3)以10kW户用系统为例,分步骤演示建模过程,包括光伏阵列搭建、P&O控制器实现(含MATLAB代码)、并网控制设计等;4)通过仿真验证系统在光照突变下的动态响应性能,MPPT效率达98.3%。文章还提出了变步长P&O等优化方向,为光伏系统仿真与控制提供实用指导。

xiaoheshang_123的博客 112

java application文件夹_java 读取 application配置文件

application.ymlhedd:#单字younger-brother:小弟little-brother:小兄弟#类数据all:bigSister:大妹子littleGirl:小妹子#组数据ofAll:yourUncle:你大爷,你三大爷,你二大爷mavenorg.springframework.bootspring-boot-configuration-processortrue...

weixin_34929072的博客 417

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 读取 application配置文件信息

java 读取 application配置文件 application.yml hedd: #单字 younger-brother: 小弟 little-brother: 小兄弟 #类数据 all: bigSister: 大妹子 littleGirl: 小妹子 #组数据 ofAll: yourUncle: 你大爷,你三大爷,你二大爷 maven <!--注释器配置 -> 读取配置文件--> <d

qq_43036466的博客 1136

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AI原生开发工具链:Codex CLI与superpowers四层架构解析

AI编程助手已从简单代码补全演进为深度集成的本地化开发范式。其核心是基于LLM的离线推理能力、AST上下文感知、安全沙箱执行与跨应用上下文同步等关键技术原理。这类工具链显著提升Java/Spring Boot等企业级项目的开发效率与可维护性,尤其在代码生成、智能补全、自动化重构和遗留系统理解等场景中展现出工程级实用价值。本文聚焦Codex CLI、Antigravity、Cursor与Claude Code构成的superpowers协同体系,深入剖析其本地化运行机制与真实落地瓶颈。

weixin_28829339的博客 282

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Go语言安全审计工具openclaw-audit:架构、规则引擎与实战指南

在网络安全领域,自动化安全审计工具已成为识别Web应用和API漏洞的关键技术手段。其核心原理是通过模拟攻击行为,对目标系统进行深度检测,从而发现潜在的安全风险。这类工具的技术价值在于能够将安全知识(漏洞检测逻辑)与执行引擎(并发调度、网络通信)实现解耦,通过可编程的规则引擎,使漏洞检测逻辑变得可复用、可积累。在实际应用场景中,高并发HTTP客户端实现和管道化处理模型是保障扫描效率的基石,它们利用Goroutine与Worker Pool机制处理大规模资产扫描,同时通过连接复用与速率限制确保扫描的稳定性和友好

weixin_34228387的博客 278

AQS公平锁与非公平锁底层原理与性能实战解析

AbstractQueuedSynchronizer(AQS)是Java并发包的核心基石,其通过volatile状态变量、CLH队列和park/unpark机制,在用户态实现高效线程阻塞与唤醒。公平锁与非公平锁的本质差异并非是否排队,而在于新线程获取锁时是否绕过队列直接CAS竞争——前者通过hasQueuedPredecessors保障FIFO顺序,后者以吞吐量优先允许‘截胡’。这种设计权衡深刻影响高并发场景下的延迟稳定性与吞吐能力,广泛应用于ReentrantLock、Semaphore等同步组件。本文结

weixin_33462167的博客 221
上一篇: Java 11 正式发布!
下一篇: JavaWeb项目放弃jsp?为什么要前后端解耦?为什么要前后端分离?
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值