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

Spring Boot开发三板斧:高效构建企业级应用的核心技法

在这里插入图片描述

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。
技术合作请加本人wx(注明来自csdn):xt20160813

在这里插入图片描述

Spring Boot开发三板斧:高效构建企业级应用的核心技法


第一板斧:RESTful API极速开发

1.1 注解驱动开发

@RestController
@RequestMapping("/api/products")
@RequiredArgsConstructor // Lombok自动生成构造器
public class ProductController {private final ProductService productService;@GetMapping("/{id}")public ResponseEntity<ProductDTO> getProduct(@PathVariable Long id) {return ResponseEntity.ok(productService.getById(id));}@PostMapping@ResponseStatus(HttpStatus.CREATED)public void createProduct(@Valid @RequestBody ProductCreateRequest request) {productService.create(request);}@ExceptionHandler(ProductNotFoundException.class)public ResponseEntity<ErrorResponse> handleNotFound(ProductNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorResponse(ex.getMessage()));}
}

核心技巧

  • 使用@RestController组合注解替代@Controller+@ResponseBody
  • 利用Lombok的@RequiredArgsConstructor实现不可变依赖注入
  • 统一异常处理采用@ExceptionHandler+@ControllerAdvice

1.2 接口文档自动化

<!-- Swagger集成依赖 -->
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.1.0</version>
</dependency>
@OpenAPIDefinition(info = @Info(title = "电商平台API", version = "1.0"),servers = @Server(url = "/", description = "默认服务器")
)
@Configuration
public class OpenApiConfig {@Beanpublic OpenAPI customOpenAPI() {return new OpenAPI().components(new Components()).info(new Info().title("电商平台API"));}
}

第二板斧:数据持久化最佳实践

2.1 JPA高效使用

@Entity
@Table(name = "orders")
@Getter @Setter @NoArgsConstructor
public class Order {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(precision = 10, scale = 2)private BigDecimal totalAmount;@Enumerated(EnumType.STRING)private OrderStatus status;@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)private List<OrderItem> items = new ArrayList<>();public void addItem(OrderItem item) {items.add(item);item.setOrder(this);}
}public interface OrderRepository extends JpaRepository<Order, Long> {@Query("SELECT o FROM Order o WHERE o.status = :status AND o.createTime > :start")List<Order> findRecentByStatus(@Param("status") OrderStatus status,@Param("start") LocalDateTime startTime);@Modifying@Query("UPDATE Order o SET o.status = :newStatus WHERE o.id = :id")int updateStatus(@Param("id") Long orderId, @Param("newStatus") OrderStatus newStatus);
}

性能优化点

  • 使用@Transactional控制事务边界
  • 批量操作采用@Modifying+@Query
  • N+1查询问题通过@EntityGraph解决

2.2 多数据源配置

spring:datasource:primary:jdbc-url: jdbc:mysql://primary-db:3306/mainusername: adminpassword: ${PRIMARY_DB_PASSWORD}secondary:jdbc-url: jdbc:mysql://report-db:3306/reportusername: reporterpassword: ${REPORT_DB_PASSWORD}
@Configuration
@EnableJpaRepositories(basePackages = "com.example.primary",entityManagerFactoryRef = "primaryEntityManager",transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {// 主数据源配置
}@Configuration
@EnableJpaRepositories(basePackages = "com.example.secondary",entityManagerFactoryRef = "secondaryEntityManager",transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDataSourceConfig {// 次数据源配置
}

第三板斧:生产级运维保障

3.1 健康监控配置

management:endpoints:web:exposure:include: health,info,metricsendpoint:health:show-details: alwaysgroup:db:include: dbcustom:include: diskSpacemetrics:export:prometheus:enabled: true

3.2 自定义健康检查

@Component
public class PaymentGatewayHealthIndicator implements HealthIndicator {private final PaymentService paymentService;@Overridepublic Health health() {boolean isHealthy = paymentService.checkHealth();if (isHealthy) {return Health.up().withDetail("version", "1.2.3").build();}return Health.down().withDetail("error", "支付网关无响应").build();}
}

3.3 性能指标监控

@Bean
public MeterRegistryCustomizer<PrometheusMeterRegistry> metricsCommonTags() {return registry -> registry.config().commonTags("application", "order-service","environment", env.getProperty("spring.profiles.active"));
}

三板斧进阶技巧

1. 热部署神器

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>

效果

  • 修改Java类后自动重启(Classloader级别)
  • 静态资源修改无需重启
  • 默认禁用模板缓存

2. 配置终极方案

@Configuration
@ConfigurationProperties(prefix = "app.notification")
@Data // Lombok自动生成getter/setter
public class NotificationConfig {private boolean enabled = true;private int retryCount = 3;private List<String> channels = List.of("SMS");private Map<String, String> templates = new HashMap<>();
}

3. 安全防护标配

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {private final UserDetailsService userDetailsService;@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeRequests(auth -> auth.antMatchers("/api/public/**").permitAll().antMatchers("/api/admin/**").hasRole("ADMIN").anyRequest().authenticated()).formLogin(form -> form.loginPage("/login").defaultSuccessUrl("/dashboard")).rememberMe(remember -> remember.key("uniqueAndSecret").tokenValiditySeconds(86400)).logout(logout -> logout.logoutSuccessUrl("/login?logout"));return http.build();}
}

常见问题解决方案

问题1:依赖冲突

# 查看依赖树
mvn dependency:tree -Dincludes=com.fasterxml.jackson.core# 解决方案:排除冲突依赖
<dependency><groupId>problematic-group</groupId><artifactId>problematic-artifact</artifactId><exclusions><exclusion><groupId>conflict-group</groupId><artifactId>conflict-artifact</artifactId></exclusion></exclusions>
</dependency>

问题2:配置不生效

# 启用配置调试
--debug
# 或在application.yml中设置
debug: true

问题3:性能调优

# 调整Tomcat参数
server:tomcat:max-threads: 200min-spare-threads: 10accept-count: 100connection-timeout: 5000# 配置HikariCP连接池
spring:datasource:hikari:maximum-pool-size: 20connection-timeout: 30000idle-timeout: 600000max-lifetime: 1800000

三板斧实战口诀

  1. API开发三步走
    @RestController定框架 → @Service写逻辑 → @Repository管数据

  2. 配置管理三原则
    环境分离(dev/test/prod) → 安全隔离(Vault/加密) → 版本控制(Git管理)

  3. 运维保障三件套
    健康检查(/actuator/health) → 指标监控(Prometheus) → 日志追踪(ELK)

掌握这三项核心技能,即可快速构建符合生产要求的Spring Boot应用。建议从官方Starters列表(spring.io/projects/spring-boot)中选择必要依赖,保持依赖最小化原则,逐步扩展功能模块。

相关文章:

Spring Boot开发三板斧:高效构建企业级应用的核心技法

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…...

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…...

大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧

目录 背景一、Hive基础查询核心语法1. 基础查询&#xff08;SELECT & FROM&#xff09;2. 条件过滤&#xff08;WHERE&#xff09;3. 聚合与分组&#xff08;GROUP BY & HAVING&#xff09;4. 排序与限制&#xff08;ORDER BY & LIMIT&#xff09; 二、复杂查询实战…...

手搓多模态-03 顶层和嵌入层的搭建

声明&#xff1a;本代码非原创&#xff0c;是博主跟着国外大佬的视频教程编写的&#xff0c;本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分&#xff0c;这一部分的主要功能是接收一个batch的图像&#xff0c;并将其转化为上下文相关的嵌入向量&#xff0c;…...

【经验分享】将qt的ui文件转换为py文件

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 首先简单的设计一个U…...

常用的国内镜像源

常见的 pip 镜像源 阿里云镜像&#xff1a;https://mirrors.aliyun.com/pypi/simple/ 清华大学镜像&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 中国科学技术大学镜像&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣镜像&#xff1a;https://pypi.doub…...

探秘JVM内部

在我们编写Java代码&#xff0c;点击运行后&#xff0c;会发生什么事呢&#xff1f; 首先&#xff0c;Java源代码会经过Java编译器将其编译成字节码&#xff0c;放在.class文件中 然后这些字节码文件就会被加载到jvm中&#xff0c;然后jvm会读取这些文件&#xff0c;调用相关…...

在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面

大家好&#xff0c;我是 V 哥。 《鸿蒙 HarmonyOS 开发之路 卷1 ArkTS篇》已经出版上市了哈&#xff0c;有需要的朋友可以关注一下&#xff0c;卷2应用开发篇也马上要出版了&#xff0c;V 哥正在紧锣密鼓的写鸿蒙开发实战卷3的教材&#xff0c;卷3主要以项目实战为主&#xff0…...

利用空间-运动-回波稀疏性进行5D图像重建,以实现自由呼吸状态下肝脏定量磁共振成像(MRI)的加速采集|文献速递--深度学习医疗AI最新文献

Title 题目 5D image reconstruction exploiting space-motion-echo sparsity foraccelerated free-breathing quantitative liver MRI 利用空间-运动-回波稀疏性进行5D图像重建&#xff0c;以实现自由呼吸状态下肝脏定量磁共振成像&#xff08;MRI&#xff09;的加速采集 …...

Qt5 Mac系统检查休眠

在开发跨平台应用程序时,有时候我们需要检测系统的状态,比如是否处于休眠或唤醒状态。Qt是一个强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。在这个场景下,我们关注的是如何在Qt5.10中检测到系统是否休眠以及在Mac上实现这一功能。本文将深入…...

ZKmall开源商城B2B2C电商用户隐私信息保护策略:数据脱敏全链路实践

随着业务的不断拓展和用户规模的持续扩大&#xff0c;用户隐私信息的保护也面临着前所未有的挑战。下面将深入探讨ZKmall开源商城在数据脱敏方面的实践&#xff0c;以及针对B2B2C电商用户隐私信息的具体保护策略。 数据脱敏&#xff0c;又称数据去标识化或数据匿名化&#xff0…...

Media streaming mental map

Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…...

linux Gitkraken 破解

ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客...

SSL证书颁发机构有哪些呢

证书颁发机构&#xff08;Certificate Authority, CA&#xff09;是负责签发和管理数字证书的权威机构&#xff0c;分为公共信任的 CA 和私有/内部 CA。以下是常见的公共信任的 CA 分类及代表机构&#xff1a; 1. 国际知名公共 CA&#xff08;浏览器/操作系统默认信任&#xff…...

13_pandas可视化_seaborn

导入库 import numpy as np import pandas as pd # import matplotlib.pyplot as plt #交互环境中不需要导入 import seaborn as sns sns.set_context({figure.figsize:[8, 6]}) # 设置图大小 # 屏蔽警告 import warnings warnings.filterwarnings("ignore")关系图 …...

Pgvector的安装

Pgvector的安装 向量化数据的存储&#xff0c;可以为 PostgreSQL 安装 vector 扩展来存储向量化数据 注意&#xff1a;在安装vector扩展之前&#xff0c;请先安装Postgres数据库 vector 扩展的步骤 1、下载vs_BuildTools 下载地址&#xff1a; https://visualstudio.microso…...

如何在大型项目中组织和管理 Vue 3 Hooks?

众所周知,Vue Hooks(通常指 Composition API 中的功能)是 Vue 3 引入的一种代码组织方式,用于更灵活地组合和复用逻辑。但是在项目中大量使用这种写法该如何更好的搭建结构呢?以下是可供参考实践的案例。 一、Hooks 组织原则 单一职责每个 Hook 应专注于完成单一功能,避…...

Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)

上文有介绍deepseek接入&#xff0c;但是需要 付费&#xff0c;虽然 sliconflow 可以白嫖 token&#xff0c;但是毕竟是有限的&#xff0c;本文将介绍一款完全免费的 API——讯飞星火 目录 接入讯飞星火&#xff08;免费&#xff09; 测试对话 接入Django 扩展建议 接入讯飞星火…...

路由器学习

路由器原理 可以理解成把不同的网络打通&#xff0c;实现通信的设备。比如家里的路由器&#xff0c;他就是把家里的内网和互联网&#xff08;外网&#xff09;打通。 分类 1.&#xff08;按应用场景分类&#xff09; 路由器分为家用的&#xff0c;企业级的&#xff0c;运营…...

Redis 连接:深入解析与优化实践

Redis 连接:深入解析与优化实践 引言 Redis 作为一款高性能的键值型数据库,广泛应用于缓存、会话存储、消息队列等领域。Redis 的连接管理是确保其性能和稳定性的关键。本文将深入探讨 Redis 连接的原理、配置、优化方法以及常见问题,帮助您更好地掌握 Redis 连接技术。 …...

UE5学习记录part14

第17节 enemy behavior 173 making enemies move: AI Pawn Navigation 按P查看体积 So its very important that our nav mesh bounds volume encompasses all of the area that wed like our 因此&#xff0c;我们的导航网格边界体积必须包含我们希望 AI to navigate in and …...

【中间件】使用ElasticSearch提供的RestClientAPI操作ES

一、简介 ElasticSearch提供了RestClient来操作ES&#xff0c;包括对数据的增删改查&#xff0c;可参照官方文档&#xff1a;Java High Level REST Client 二、使用步骤&#xff1a; 可参照官方文档操作 导包 <dependency><groupId>org.elasticsearch.client<…...

Docker的备份与恢复

一、两种基本方式 docker export / import 在服务器上导出容器docker export container_name > container_backup.tar这里使用 > 重定向时默认保存路径为当前运行命令的路径&#xff0c;可以自行指定绝对路径来保存&#xff0c;后续加载时也使用对应的路径即可。 恢复为…...

C++ string 对象的操作(三十五)

1. string 对象的常见操作 下面的表格列出了 string 类型最常用的一些操作以及它们的功能&#xff1a; 操作说明示例os << s将字符串对象 s 写入输出流 os&#xff0c;返回 os。std::cout << s;is >> s从输入流 is 中读取字符串赋给 s&#xff08;以空白分…...

DAPP实战篇:规划下我们的开发线路

前言 在DApp实战篇&#xff1a;先用前端起个项目一文中我们起了一个前端项目&#xff0c;在后续开发中笔者将带领大家一步步完成这个DAPP&#xff0c;为了方便后续讲解&#xff0c;本篇将完整说明后续我们要进行的开发和思路。 主打前端 实际上一个完整的DAPP是由前端和智能…...

[leetcode] 面试经典 150 题——篇9:二叉树(番外:二叉树的遍历方式)

二叉树的遍历是指按照某种顺序访问二叉树中的每个节点。常见的遍历方式有四种&#xff1a;前序遍历&#xff08;Pre-order Traversal&#xff09;、中序遍历&#xff08;In-order Traversal&#xff09;、后序遍历&#xff08;Post-order Traversal&#xff09;以及层序遍历&am…...

【Elasticsearch】开启大数据分析的探索与预处理之旅

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

状态机思想编程练习

状态机实现LED流水灯 本次实验&#xff0c;我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯&#xff0c;并通过Modelsim来进行模拟仿真&#xff0c;再到DE2-115开发板上进行验证。 ​ 首先进行主要代码的编写。 module led (input sys_clk,input sys_…...

C#:接口(interface)

目录 接口的核心是什么&#xff1f; 1. 什么是接口&#xff08;Interface&#xff09;&#xff0c;为什么要用它&#xff1f; 2. 如何定义和使用接口&#xff1f; 3.什么是引用接口&#xff1f; 如何“引用接口”&#xff1f; “引用接口”的关键点 4. 接口与抽象类的区…...

前端新增数据,但数据库里没有新增的数据

先看情况&#xff1a; 1.前端&#xff0c;可以进行删查改&#xff0c;但是新增数据之后&#xff0c;显示保存成功&#xff0c;也增加了空白的一行&#xff0c;但是数据没有显示出来。 2.后端接收到了数据&#xff0c;但返回结果的列表里面是空的&#xff1b;同时数据库里面没…...