Spring 设计模式:经典设计模式

news2025/1/8 18:50:30

Spring 设计模式:经典设计模式

引言

Spring 框架广泛使用了经典设计模式。

这些模式在 Spring 内部发挥着重要作用。

通过理解这些设计模式在 Spring 中的应用,开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。

经典设计模式

控制反转(IoC)与依赖注入(DI)

  • 应用场景:Spring 的核心机制。
  • 示例
// IoC与DI示例
public class UserService {
private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }

}

工厂模式(Factory Pattern)

  • 应用场景:BeanFactory 和 ApplicationContext。
  • 示例
// 工厂模式示例:BeanFactory
public interface BeanFactory {
    Object getBean(String name);
}

public class ApplicationContext implements BeanFactory {
    @Override
    public Object getBean(String name) {
        // 返回Bean实例
        return new Object();
    }
}

单例模式(Singleton Pattern)

  • 应用场景:Spring 容器默认管理 Bean 的方式。
  • 示例
// 单例模式示例:Spring Bean
@Component
public class SingletonBean {
    // Bean的单例实例
}

代理模式(Proxy Pattern)

  • 应用场景:Spring AOP。
  • 示例
// 代理模式示例:AOP代理
public interface UserService {
    void saveUser(User user);
}

public class UserServiceImpl implements UserService {
    @Override
    public void saveUser(User user) {
        // 保存用户逻辑
    }
}

public class UserServiceProxy implements UserService {
    private UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void saveUser(User user) {
        System.out.println("Before saving user");
        userService.saveUser(user);
        System.out.println("After saving user");
    }

}

模板方法模式(Template Method Pattern)

  • 应用场景:JdbcTemplate、JpaTemplate。
  • 示例
// 模板方法模式示例:JdbcTemplate
public abstract class JdbcTemplate {
    public void executeQuery(String sql) {
        // 模板方法
        openConnection();
        runQuery(sql);
        closeConnection();
    }

    protected abstract void runQuery(String sql);

    private void openConnection() {
        // 打开连接
    }

    private void closeConnection() {
        // 关闭连接
    }
}

策略模式(Strategy Pattern)

  • 应用场景:Spring 事务管理。
  • 示例
// 策略模式示例:事务管理
public interface TransactionStrategy {
    void execute();
}

public class JdbcTransactionStrategy implements TransactionStrategy {
    @Override
    public void execute() {
        // JDBC事务逻辑
    }
}

public class JtaTransactionStrategy implements TransactionStrategy {
    @Override
    public void execute() {
        // JTA事务逻辑
    }
}

观察者模式(Observer Pattern)

  • 应用场景:Spring 事件驱动模型。
  • 示例
// 观察者模式示例:事件监听
public class ApplicationEvent {
    // 事件内容
}

public interface ApplicationListener {
    void onApplicationEvent(ApplicationEvent event);
}

public class CustomEventListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        // 处理事件
    }
}

装饰器模式(Decorator Pattern)

  • 应用场景:扩展或修改 Bean 的功能。
  • 示例
// 装饰器模式示例:DAO扩展
public interface UserDao {
    void saveUser(User user);
}

public class UserDaoImpl implements UserDao {
    @Override
    public void saveUser(User user) {
        // 保存用户逻辑
    }
}

public class LoggingUserDaoDecorator implements UserDao {
    private UserDao userDao;

    public LoggingUserDaoDecorator(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void saveUser(User user) {
        System.out.println("Before saving user");
        userDao.saveUser(user);
        System.out.println("After saving user");
    }
}

门面模式(Facade Pattern)

  • 应用场景:Spring 的 ApplicationContext。
  • 示例
// 门面模式示例:ApplicationContext
public class ApplicationContext {
    public Object getBean(String name) {
        // 返回Bean实例
        return new Object();
    }
}

结论

Spring框架通过综合运用多种经典设计模式,实现了灵活性、扩展性和可维护性,满足了现代企业级应用开发的多样需求。

开发者应深入理解这些设计模式在 Spring 中的应用,以更好地掌握 Spring 框架的设计哲学和实现细节。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

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

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

相关文章

“AI 视频图像识别系统,开启智能新视界

咱老百姓现在的生活啊,那是越来越离不开高科技了,就说这 AI 视频图像识别系统,听起来挺高大上,实际上已经悄无声息地融入到咱们日常的方方面面,给咱带来了超多便利。 先讲讲安防领域吧,这可是 AI 图像识别的…

开源AI智能名片2+1链动模式S2B2C商城小程序在商业流量获取中的应用研究

摘要: 随着互联网技术的迅猛发展,商业流量的获取已成为企业市场竞争中的关键环节。传统意义上的“客流量”在互联网语境下被赋予了新的内涵,即“商业流量”,其本质依然指向用户。在当前线上线下融合的商业环境中,流量…

【蓝桥杯研究生组】第14届Java试题答案整理

试题链接&#xff1a;链接 A题 满足条件的答案有&#xff1a;35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数&#xff0c;也是日的倍数for (int year2000; year<2000000; year) {for …

c/c++ 里的进程间通信 , 管道 pipe 编程举例

&#xff08;1&#xff09;以下是一个网上的使用 pipe 编程的范例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…

RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器&#xff0c;支持8K视频编解码&#xff0c;多屏4K输出&#xff0c;可实现12屏联屏拼接、同显、异显&#xff0c;适配多种操作系统&#xff0c;广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…

uniapp使用chooseLocation安卓篇

本文章全部以高德地图为例 代码 <view class"bottom"><button click"choose">定位</button> </view> choose() {uni.chooseLocation({success: function(res) {console.log(位置名称&#xff1a; res.name);console.log(详细地…

flutter 专题三十三 Flutter 重构去哪儿QTalk

QTalk 是去哪儿网内部的一个 IM 沟通工具&#xff0c;同时集成了很多内部的系统&#xff0c;比如 OA 审批&#xff0c;门禁打卡&#xff0c;请假审批&#xff0c;预定会议室&#xff0c;驼圈&#xff08;驼厂朋友圈&#xff09;等功能&#xff1b;方便内部办公沟通、交流的同时…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…

141.环形链表 142.环形链表II

141.环形链表 & 142.环形链表II 141.环形链表 思路&#xff1a;快慢指针 or 哈希表 快慢指针代码&#xff1a; class Solution { public:bool hasCycle(ListNode *head) {if(headnullptr||head->nextnullptr)return false;ListNode *fasthead->next; //不能设置成…

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)

软件系统实施标准化流程设计至关重要&#xff0c;因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误&#xff0c;提升代码质量和系统稳定性。同时&#xff0c;它促进了团队成员间的沟通与协作&#xff0c;确保项目按时交付。此外&#xff0c;…

uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端

采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件&#xff0c;提供点状、条状的动画过渡效果&#xff0c;支持多项自定义配置&#xff0c;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&…

python vue3实现大文件分段续传(断点续传)--带暂停和继续功能

后端内容无变化具体设置可参考上一篇点击进入上一篇&#xff0c;需要注意的是big_file_upload_backend/settings.py下的 是statics 多个s其实无所谓&#xff0c;但是要一致 STATIC_URL "statics/" STATICFILES_DIRS [os.path.join(BASE_DIR, "../statics&quo…

STM32之CAN通讯(十一)

STM32F407 系列文章 - CAN通讯&#xff08;十一&#xff09; 目录 前言 一、CAN 二、CAN驱动电路 三、CAN软件设计 1.CAN状态初始化 2.头文件相关定义 3.接收中断服务函数 4.用户层使用 1.用户层相关定义 2.发送数据 3.接收数据 1.查询方式处理 2.中断方式处理 3…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)

若依中Feign调用具体使用 注意&#xff1a;以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…

CS·GO搬砖流程详细版

说简单点&#xff0c;就是Steam买了然后BUFF上卖&#xff0c;或许大家都知道这点&#xff0c;但就是一些操作和细节问题没那么明白。我相信&#xff0c;你看完这篇文章以后&#xff0c;至少会有新的认知。 好吧&#xff0c;废话少说&#xff0c;直接上实操&#xff01; 首先准…

每日一题:链表中环的入口结点

文章目录 判断链表环的入口节点描述数据范围&#xff1a;复杂度要求&#xff1a;输入输出 示例代码实现思路解析注意事项&#xff1a; 判断链表环的入口节点 描述 给定一个链表&#xff0c;判断该链表是否存在环。如果存在环&#xff0c;返回环的入口节点&#xff1b;如果不存…

以C++为基础快速了解C#

using System: - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句, 相当于C的 using namespace std; C# 是大小写敏感的。 所有的语句和表达式必须以分号&#xff08;;&#xff09;结尾。 程序的执行从 Main 方法开始。 与 Java 不同的是&#…

保险丝驱动电路·保险丝有什么用应该如何选型详解文章!!!

目录 保险丝基础知识 保险丝常见类型 保险丝功能讲解 保险丝驱动电路 ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电…

如何在读博过程中缓解压力

博士生涯充满了挑战和压力&#xff0c;但通过一些实用的方法&#xff0c;我们可以有效地缓解这些压力。以下是我在博士期间采用的一些策略&#xff0c;希望能对正在读博或即将开始博士生涯的你有所帮助。 1. 周末彻底放松 在周末&#xff0c;我尽量避免进行论文写作。这两天…