Spring中用到了哪些设计模式
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
Spring作为Java生态的主流企业级框架,是设计模式的经典实践范本,通过各类设计模式实现了解耦、复用、扩展的核心目标,大幅降低了框架复杂度与业务开发成本。下文按设计模式三大分类,逐一拆解Spring中的核心应用场景。
一、创建型设计模式(对象创建与实例化)
创建型模式专注于对象的创建逻辑,屏蔽实例化细节,Spring的Bean管理体系是该类模式的核心落地场景。
1. 单例模式(Singleton)
核心作用:保证一个类仅有一个实例,避免重复创建消耗资源,提升性能。
Spring应用:Spring Bean默认作用域为singleton,是框架最核心的单例实践。通过SingletonBeanRegistry接口、DefaultSingletonBeanRegistry实现,将单例Bean缓存至singletonObjectsMap,全局复用同一实例。
延伸:Spring单例是容器级单例,区别于JVM全局单例,仅在当前Spring容器中唯一。
2. 工厂模式(简单工厂+工厂方法+抽象工厂)
核心作用:封装对象创建逻辑,解耦调用方与实例化过程。
- 简单工厂:BeanFactory作为Spring顶层工厂接口,根据Bean名称/类型直接获取实例,屏蔽Bean创建细节。
- 工厂方法:FactoryBean接口,允许自定义Bean创建逻辑,适用于复杂实例化场景(如Mybatis的SqlSessionFactoryBean)。
- 抽象工厂:ApplicationContext整合多类工厂,统一提供Bean获取、资源加载、事件发布等能力,是工厂模式的高阶整合。
3. 建造者模式(Builder)
核心作用:分步构建复杂对象,分离构建与表示。
Spring应用:BeanDefinitionBuilder用于构建BeanDefinition对象,分步设置Bean的类名、作用域、依赖、初始化方法等属性,最终生成完整的Bean定义信息,适配复杂Bean的配置组装。
4. 原型模式(Prototype)
核心作用:通过克隆现有实例创建新对象,避免重复初始化开销。
Spring应用:Bean作用域设置为prototype时,每次获取Bean都会克隆创建新实例,适用于无状态、需频繁创建的业务对象。
二、结构型设计模式(对象组合与架构搭建)
结构型模式关注类/对象的组合关系,实现功能增强、接口适配、架构简化,Spring AOP、Web模块大量依赖此类模式。
1. 代理模式(静态代理+动态代理)
核心作用:通过代理对象增强目标对象功能,不修改原代码。
Spring应用:Spring AOP的核心实现基础,分为两种动态代理:
- JDK动态代理:针对实现接口的类,通过反射生成代理类。
- CGLIB代理:针对无接口的类,通过继承目标类生成代理子类。
通过代理实现事务控制、日志打印、权限校验等横切逻辑,彻底解耦业务代码与增强逻辑。
2. 适配器模式(Adapter)
核心作用:兼容不同接口,让不兼容的类协同工作。
- Spring MVC:HandlerAdapter接口,适配不同类型的处理器(Controller、HttpRequestHandler等),统一处理器调用逻辑,让DispatcherServlet无需关注具体处理器类型。
- AOP模块:AdvisorAdapter,适配不同类型的增强器(Advisor),统一拦截逻辑执行。
3. 装饰器模式(Decorator)
核心作用:动态增强对象功能,优于继承扩展。
Spring应用:
- BeanWrapper接口:包装Bean对象,动态增强属性赋值、类型转换、属性访问能力。
- 缓存装饰:Spring Cache通过装饰器模式,为方法添加缓存能力,不修改原有业务逻辑。
4. 外观模式(Facade)
核心作用:提供统一入口,屏蔽子系统复杂细节,简化调用。
Spring应用:ApplicationContext是典型外观模式,整合BeanFactory、ResourceLoader、ApplicationEventPublisher等子模块,对外提供统一的容器操作接口,开发者无需关注底层子模块交互。
5. 组合模式(Composite)
核心作用:将对象组织成树形结构,统一处理单个对象与组合对象。
Spring应用:BeanDefinition的嵌套配置、CompositeComponentDefinition,处理父子容器、嵌套Bean的组合关系,统一管理层级化的Bean定义。
三、行为型设计模式(对象交互与职责分配)
行为型模式关注对象间的通信、职责划分与流程控制,Spring的事务、事件、模板模块均有体现。
1. 模板方法模式(Template Method)
核心作用:定义固定流程骨架,将可变步骤延迟到子类实现。
Spring应用:
- JdbcTemplate:定义数据库操作固定流程(获取连接、执行SQL、释放资源),子类只需实现SQL执行逻辑。
- RedisTemplate、HibernateTemplate等各类Template类,均采用该模式封装通用操作。
2. 策略模式(Strategy)
核心作用:定义一组算法,封装每个算法并使其可互换,动态切换实现逻辑。
- 资源加载:Resource接口根据不同策略(URL、ClassPath、文件系统)加载资源,对应UrlResource、ClassPathResource等实现类。
- 事务管理:PlatformTransactionManager接口,支持JDBC、JPA、Hibernate等不同事务策略,动态切换事务实现。
- AOP代理选择:根据目标类是否实现接口,动态切换JDK/CGLIB代理策略。
3. 观察者模式(Observer)
核心作用:定义对象间一对多依赖,被观察者状态变化时,所有观察者自动收到通知。
Spring应用:Spring事件驱动模型,核心组件包括:
- 被观察者:ApplicationEvent(事件对象)。
- 观察者:ApplicationListener(事件监听器)。
- 事件发布器:ApplicationEventPublisher,容器启动、上下文刷新等场景自动发布事件,监听器异步/同步响应。
4. 责任链模式(Chain of Responsibility)
核心作用:将请求沿对象链传递,每个节点按需处理,解耦请求发送方与处理方。
- Spring MVC:拦截器链(HandlerInterceptor),请求依次经过权限校验、日志打印、参数解析等拦截器处理。
- Web过滤器链(Filter):处理编码、跨域、安全校验等请求逻辑。
- AOP增强链:多个Advisor按顺序执行,形成拦截责任链。
5. 迭代器模式(Iterator)
核心作用:统一遍历集合对象,屏蔽底层数据结构。
Spring应用:CompositeIterator用于遍历嵌套的Bean集合、组件列表,统一迭代逻辑,适配不同类型的集合遍历场景。
核心总结:Spring通过设计模式实现了高内聚、低耦合的架构特性,其中单例、工厂、代理、模板方法、策略模式是最高频的核心模式,贯穿IOC、AOP、MVC、事务全模块,也是理解Spring源码的关键突破口。
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
本专栏聚焦Spring全生态体系,从IoC/AOP核心原理入手,覆盖Spring Boot自动配置、事务管理、Web开发等实战内容。拆解循环依赖、动态代理等高频面试难点,助力开发者从入门到精通,打通单体到微服务的技术链路,解决企业级开发痛点,提升架构设计与问题排查能力,成为Java后端进阶的必备技术专栏。
查看12道真题和解析