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

Java 设计模式在 Spring 中的现代应用:构建优雅的企业级应用

Java 设计模式在 Spring 中的现代应用构建优雅的企业级应用别叫我大神叫我 Alex 就好。一、引言大家好我是 Alex。设计模式是软件设计中经过验证的解决方案它们帮助我们解决常见的设计问题。Spring 框架作为 Java 企业级应用的主流框架大量应用了各种设计模式。今天我想和大家分享一下 Java 设计模式在 Spring 中的现代应用帮助大家构建更优雅、更可维护的企业级应用。二、创建型模式1. 单例模式Spring 中的应用Bean 注解默认情况下Spring 容器中的 Bean 都是单例的Scope(singleton)显式指定单例作用域Configuration public class AppConfig { Bean Scope(singleton) public UserService userService() { return new UserServiceImpl(); } }现代实践合理使用单例模式避免全局状态结合 Spring 的依赖注入减少手动单例管理2. 工厂方法模式Spring 中的应用FactoryBean 接口用于创建复杂的 BeanBeanFactorySpring 容器的核心接口public class UserFactoryBean implements FactoryBeanUser { private String username; Override public User getObject() throws Exception { User user new User(); user.setUsername(username); return user; } Override public Class? getObjectType() { return User.class; } Override public boolean isSingleton() { return true; } public void setUsername(String username) { this.username username; } }现代实践使用 Lambda 表达式简化工厂方法结合 Spring Boot 的自动配置3. 建造者模式Spring 中的应用Builder 注解结合 Lombok 使用BeanDefinitionBuilder用于构建 Bean 定义Data Builder public class User { private Long id; private String username; private String email; } // 使用建造者模式创建对象 User user User.builder() .id(1L) .username(alex) .email(alexexample.com) .build();现代实践结合 Lombok 简化建造者模式的实现使用流式 API 提高代码可读性三、结构型模式1. 代理模式Spring 中的应用AOP (Aspect-Oriented Programming)基于代理实现JDK 动态代理接口代理CGLIB 代理类代理Aspect Component public class LoggingAspect { Before(execution(* com.example.service.*.*(..))) public void logBefore(JoinPoint joinPoint) { System.out.println(Before method: joinPoint.getSignature().getName()); } AfterReturning(pointcut execution(* com.example.service.*.*(..)), returning result) public void logAfterReturning(JoinPoint joinPoint, Object result) { System.out.println(After method: joinPoint.getSignature().getName()); System.out.println(Return value: result); } }现代实践使用注解驱动的 AOP结合 Spring Boot 的自动配置2. 适配器模式Spring 中的应用HandlerAdapter处理不同类型的处理器WebMvcConfigurerAdapter配置 Spring MVCConfiguration public class WebConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*); } }现代实践使用函数式接口和 Lambda 表达式结合 Spring Boot 的自动配置3. 装饰器模式Spring 中的应用BeanPostProcessorBean 初始化前后的处理HttpMessageConverter消息转换的装饰Component public class CustomBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof UserService) { System.out.println(Before initializing UserService); } return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof UserService) { System.out.println(After initializing UserService); } return bean; } }现代实践使用注解驱动的装饰结合 Spring Boot 的自动配置四、行为型模式1. 观察者模式Spring 中的应用ApplicationEvent应用事件ApplicationListener事件监听器// 定义事件 public class UserCreatedEvent extends ApplicationEvent { private User user; public UserCreatedEvent(Object source, User user) { super(source); this.user user; } public User getUser() { return user; } } // 发布事件 Service public class UserService { Autowired private ApplicationEventPublisher eventPublisher; public User createUser(User user) { // 保存用户 // ... // 发布事件 eventPublisher.publishEvent(new UserCreatedEvent(this, user)); return user; } } // 监听事件 Component public class UserCreatedListener implements ApplicationListenerUserCreatedEvent { Override public void onApplicationEvent(UserCreatedEvent event) { User user event.getUser(); System.out.println(User created: user.getUsername()); // 发送邮件、记录日志等 } }现代实践使用 EventListener 注解结合异步事件处理2. 策略模式Spring 中的应用HandlerMapping不同的请求映射策略DataSource不同的数据源策略public interface PaymentStrategy { void pay(double amount); } Service(alipay) public class AlipayStrategy implements PaymentStrategy { Override public void pay(double amount) { System.out.println(Paying amount via Alipay); } } Service(wechat) public class WechatPayStrategy implements PaymentStrategy { Override public void pay(double amount) { System.out.println(Paying amount via Wechat Pay); } } Service public class PaymentService { Autowired private MapString, PaymentStrategy paymentStrategies; public void pay(String type, double amount) { PaymentStrategy strategy paymentStrategies.get(type); if (strategy null) { throw new IllegalArgumentException(Invalid payment type); } strategy.pay(amount); } }现代实践使用 Qualifier 注解选择策略结合 Spring Boot 的条件配置3. 模板方法模式Spring 中的应用JdbcTemplate数据库操作模板RestTemplateREST 操作模板Service public class UserService { Autowired private JdbcTemplate jdbcTemplate; public User findUserById(Long id) { return jdbcTemplate.queryForObject( SELECT * FROM users WHERE id ?, new Object[]{id}, (rs, rowNum) - { User user new User(); user.setId(rs.getLong(id)); user.setUsername(rs.getString(username)); user.setEmail(rs.getString(email)); return user; } ); } }现代实践使用 Lambda 表达式简化模板方法结合 Spring Boot 的自动配置五、Spring 特有的设计模式1. 依赖注入模式Spring 中的应用Autowired自动注入依赖InjectJSR-330 标准注入ResourceJSR-250 标准注入Service public class UserService { private final UserRepository userRepository; private final EmailService emailService; Autowired public UserService(UserRepository userRepository, EmailService emailService) { this.userRepository userRepository; this.emailService emailService; } // 业务方法 }现代实践使用构造器注入避免循环依赖结合 Lombok 的 RequiredArgsConstructor2. 控制反转模式Spring 中的应用ApplicationContextSpring 容器BeanFactoryBean 工厂public class Application { public static void main(String[] args) { ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class); UserService userService context.getBean(UserService.class); // 使用 userService } }现代实践使用 Spring Boot 的自动配置结合 ComponentScan 自动扫描3. 配置元数据模式Spring 中的应用Configuration配置类BeanBean 定义Value属性注入Configuration PropertySource(classpath:application.properties) public class AppConfig { Value(${database.url}) private String databaseUrl; Value(${database.username}) private String databaseUsername; Value(${database.password}) private String databasePassword; Bean public DataSource dataSource() { DriverManagerDataSource dataSource new DriverManagerDataSource(); dataSource.setUrl(databaseUrl); dataSource.setUsername(databaseUsername); dataSource.setPassword(databasePassword); return dataSource; } }现代实践使用 ConfigurationProperties 批量注入属性结合 Spring Boot 的 application.yml 配置六、最佳实践1. 合理选择设计模式根据具体场景选择合适的设计模式避免过度设计保持简单结合 Spring 的特性简化模式实现2. 结合 Spring Boot使用 Spring Boot 的自动配置利用 Spring Boot 的 starters遵循 Spring Boot 的约定优于配置3. 代码质量保持代码简洁明了遵循 SOLID 原则编写单元测试七、实战案例案例电商系统订单处理需求支持多种支付方式订单状态管理异步处理订单事件实现// 策略模式支付策略 public interface PaymentStrategy { void pay(Order order); } // 观察者模式订单事件 public class OrderCreatedEvent extends ApplicationEvent { private Order order; // 构造器和 getter } // 模板方法模式订单处理模板 public abstract class OrderProcessingTemplate { public final void process(Order order) { validate(order); processPayment(order); updateStatus(order); notifyListeners(order); } protected abstract void validate(Order order); protected abstract void processPayment(Order order); protected abstract void updateStatus(Order order); protected abstract void notifyListeners(Order order); } Service public class OnlineOrderProcessor extends OrderProcessingTemplate { // 实现抽象方法 }八、总结设计模式是构建高质量软件的重要工具Spring 框架为我们提供了丰富的模式实现。通过合理应用这些模式我们可以构建出更优雅、更可维护的企业级应用。这其实可以更优雅一点。希望这篇文章能帮助大家更好地理解和应用设计模式。如果你有任何问题欢迎在评论区留言。关于作者我是 Alex一个在 CSDN 写 Java 架构思考的暖男。喜欢手冲咖啡养了一只叫Java的拉布拉多。如果我的文章对你有帮助欢迎关注我一起探讨 Java 技术的优雅之道。

相关文章:

Java 设计模式在 Spring 中的现代应用:构建优雅的企业级应用

Java 设计模式在 Spring 中的现代应用:构建优雅的企业级应用别叫我大神,叫我 Alex 就好。一、引言 大家好,我是 Alex。设计模式是软件设计中经过验证的解决方案,它们帮助我们解决常见的设计问题。Spring 框架作为 Java 企业级应用…...

Spring Security 2026 最佳实践:构建安全可靠的应用系统

Spring Security 2026 最佳实践:构建安全可靠的应用系统别叫我大神,叫我 Alex 就好。一、引言 大家好,我是 Alex。在当今复杂的网络环境中,应用安全已经成为开发过程中不可或缺的一部分。Spring Security 作为 Spring 生态中处理安…...

SEO网络推广技术需要长期投入吗

SEO网络推广技术的长期投入:你真的需要吗? 在互联网时代,SEO(搜索引擎优化)网络推广技术已经成为企业提升在线存在感和吸引流量的重要手段。有不少企业在初期推广时常常会犹豫是否需要长期投入SEO,担心这是…...

kmp算法:我们所忽略的字符串匹配本质

一、先捅破窗户纸:前后缀在匹配里到底起什么作用?在讲next数组的计算之前,我们必须先把“为什么有前后缀,就能不回退主串”这个核心逻辑彻底讲透,这是字符串匹配的本质核心。我们用一个有前后缀的经典案例,…...

在树莓派上运行本地 LLM 和 VLM

原文:towardsdatascience.com/running-local-llms-and-vlms-on-the-raspberry-pi-57bd0059c41a?sourcecollection_archive---------0-----------------------#2024-01-14 在树莓派上使用 Ollama 本地运行 Phi-2、Mistral 和 LLaVA 等模型 https://medium.com/pyes…...

利用计算机视觉进行跑步效率分析:与埃利乌德·基普乔格的比较分析

原文:towardsdatascience.com/running-efficiency-with-computer-vision-a-comparative-analysis-with-eliud-kipchoge-736eb80c574f 如何利用计算机视觉提高跑步效率? https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/…...

无代码玩法:OpenClaw网页控制台配合Qwen3.5-9B处理电商截图

无代码玩法:OpenClaw网页控制台配合Qwen3.5-9B处理电商截图 1. 为什么选择OpenClaw处理电商截图 作为一个经常网购的技术爱好者,我发现自己经常需要手动整理不同平台的商品价格信息。传统的做法是截图后人工录入Excel,既耗时又容易出错。直…...

UPnP_Generic库:嵌入式设备自动端口映射实战指南

1. UPnP_Generic库深度技术解析:嵌入式设备自动端口映射的工程实践1.1 为什么嵌入式开发者需要UPnP_Generic库在嵌入式物联网项目中,当设备需要从公网访问本地Web服务(如传感器数据页面、远程控制接口或OTA升级服务器)时&#xff…...

OpenClaw会议纪要助手:Qwen3-14b_int4_awq转写与重点提炼

OpenClaw会议纪要助手:Qwen3-14b_int4_awq转写与重点提炼 1. 为什么需要自动化会议纪要 作为远程工作者,我每周要参加至少15场跨时区会议。过去手动整理纪要时经常遇到三个痛点:一是录音转文字耗时(1小时会议需要2小时整理&…...

OpenClaw长期运行优化:Qwen3.5-9B-AWQ-4bit内存泄漏排查

OpenClaw长期运行优化:Qwen3.5-9B-AWQ-4bit内存泄漏排查 1. 问题背景与现象描述 上周我的OpenClaw网关服务在连续运行72小时后突然崩溃,导致自动化任务全部中断。查看系统监控发现内存占用从初始的2GB逐渐增长到16GB(我的服务器总内存&…...

ssh进阶用法

ssh登录与ssh配置文件 使用ssh可以从一台设备登录到另一台已开启sshd服务的远程设备。 Ubuntu-22.04 coliDESKTOP-J45M1NUM:~$ ssh yukari172.28.24.152 The authenticity of host 172.28.24.152 (172.28.24.152) cant be established. ECDSA key fingerprint is SHA256:YSC…...

基于WebAssembly的Harness扩展机制

基于WebAssembly的Harness扩展机制:构建灵活、安全且高性能的CI/CD生态系统 一、引言 钩子 (The Hook) 想象一下这个场景:您正在使用Harness构建您的CI/CD流水线,但您需要一个特定的功能——也许是一个专有的代码扫描工具,或者是与您内部系统集成的自定义步骤。传统上,…...

AI Agent Harness Engineering 的记忆架构:短期、长期与情景记忆的工程实现

AI Agent Harness Engineering 的记忆架构:短期、长期与情景记忆的工程实现 副标题:构建具有类人记忆能力的智能代理系统完整指南 第一部分:引言与基础 (Introduction & Foundation) 1. 引人注目的标题 (Compelling Title) “AI Agent Harness Engineering 的记忆架构…...

多核通信中的环形缓冲区设计与实现

1. 核间通信与环形缓冲区基础在现代多核处理器系统中,核间通信(IPC)是实现并行计算和任务协同的关键技术。共享内存是最常用的核间通信方式之一,它允许多个处理器核心通过访问同一块物理内存区域来交换数据。这种方式的优势在于避免了数据拷贝&#xff0…...

TLT库:面向Arduino的Telit ME310G1蜂窝通信轻量级C++ SDK

1. 项目概述TLT(Telit Library for Arduino)是一个面向嵌入式蜂窝通信的轻量级C库,专为CodeZoo ME310G1 Telit模块在Arduino平台上的集成而设计。该库并非从零构建,而是基于Arduino官方MKRNB库(arduino-libraries/MKRN…...

M5Unit-DigiClock模块:基于I²C的即插即用数字时钟解决方案

1. 项目概述 M5Unit-DigiClock(SKU: U146)是 M5Stack 推出的一款紧凑型数字时钟单元模块,专为 M5Stack Core 系列主控(如 Core2、CoreS3、Atom Echo)及兼容 ESP32 系列 MCU 的开发板设计。该模块并非通用 RTC 芯片的简…...

企业SEO优化与网站内容建设的关系是什么

企业SEO优化与网站内容建设的关系是什么 在现代数字营销中,企业SEO优化与网站内容建设是两个密不可分的重要环节。SEO优化(Search Engine Optimization)旨在提升网站在搜索引擎中的排名,而网站内容建设则是展示和传递企业信息的基…...

主流开源协议解析与选择指南

1. 开源协议:程序员必须掌握的法律常识第一次在GitHub上创建仓库时,面对那一长串开源协议选项,我和大多数新手一样直接懵了。MIT、Apache、GPL...这些看似简单的缩写背后,实则隐藏着影响深远的法律约束。作为从业十年的开发者&…...

OpenClaw多模型切换指南:Qwen3-4B与本地LLM混合调用

OpenClaw多模型切换指南:Qwen3-4B与本地LLM混合调用 1. 为什么需要多模型混合调用 去年冬天,当我第一次尝试用OpenClaw自动化处理技术文档时,发现一个尴尬的现象:用Qwen3-4B生成代码示例效果很好,但让它润色一段产品…...

Linux 的 link 命令

Linux 中的 link 命令用于创建硬链接(hard link),这是 Linux/Unix 文件系统中的一种特殊文件连接方式。与符号链接(symbolic link)不同,硬链接直接指向文件的 inode,而不是通过路径名引用。 命…...

Linux 的 df 命令

df (disk free) 命令是 Linux 系统中用于显示文件系统磁盘空间使用情况的常用工具。它可以报告文件系统的总容量、已用空间、可用空间以及挂载点等信息。 基本语法 df [选项] [文件或目录]常用选项 -h 或 --human-readable 以易读格式显示大小(KB, MB, GB&#xf…...

OpenClaw开源贡献:为Qwen3-4B开发新技能并提交社区

OpenClaw开源贡献:为Qwen3-4B开发新技能并提交社区 1. 为什么我们需要更多社区贡献的技能 去年冬天,当我第一次尝试用OpenClaw自动化处理每周的Markdown文档整理时,发现现有的技能库缺少一个能批量处理Front Matter的工具。这个痛点让我意识…...

RTOS在嵌入式开发中的核心价值与实战应用

1. RTOS在嵌入式开发中的核心价值我第一次接触RTOS是在2015年开发工业控制器时遇到的困境。当时用裸机编程实现多任务调度,代码已经膨胀到难以维护的程度。一个简单的功能修改需要通读上万行代码,调试一个BUG经常引发连锁反应。直到引入RTOS后&#xff0…...

OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并行处理极限

OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并行处理极限 1. 测试背景与动机 最近在折腾本地AI自动化时,遇到一个实际问题:当OpenClaw同时处理多个任务时,显存会成为瓶颈吗?我手头正好有台配备RTX4090D(…...

第23章 2014真题作文

目录 题目2014.11-论软件需求管理 题目2014.11-论非功能性需求对企业应用架构设计的影响 题目2014.11-论软件的可靠性设计 题目2014.11-论网络安全体系设计 题目2014.11-论软件需求管理 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互…...

第22章 2013真题作文

目录 题目2013.11-论软件架构建模技术与应用 题目2013.11-企业应用系统的分层架构风格 题目2013.11-论软件可靠性设计技术的应用 题目2013.11-分布式存储系统架构设计 题目2013.11-论软件架构建模技术与应用 软件架构用来处理软件高层次结构的设计和实施,它以精…...

如何利用地理位置信息优化网站的本地SEO效果

如何利用地理位置信息优化网站的本地SEO效果 在当今数字化时代,网站的本地SEO(搜索引擎优化)效果直接影响着网站的流量和用户转化率。利用地理位置信息进行本地SEO优化,不仅能够提升网站在本地用户中的可见性,还能有效…...

【复现】基于Lyapunov非线性控制-模型预测控制(LMPC)与反步法+自主水下航行器(AUV)的轨迹跟踪控制研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Linux内核模块加载机制深度解析

1. Linux内核模块加载机制深度解析在Linux系统开发中,内核模块的动态加载机制为开发者提供了极大的灵活性。作为一名长期从事内核开发的工程师,我经常需要深入理解模块加载的完整流程,这对调试复杂驱动问题和性能优化至关重要。本文将以linux…...

MacOS极简部署OpenClaw:Phi-3-mini-128k-instruct镜像快速体验

MacOS极简部署OpenClaw:Phi-3-mini-128k-instruct镜像快速体验 1. 为什么选择这个组合? 上周我在测试各种开源模型时,偶然发现了Phi-3-mini-128k-instruct这个轻量级模型。它的响应速度和对指令的理解能力让我印象深刻,特别是12…...