Spring 中常见设计模式及其典型应用场景的详细介绍

设计模式在 Spring 框架中广泛应用,帮助开发者以松耦合、高内聚的方式构建灵活且可维护的应用程序。以下是 Spring 中常见设计模式及其典型应用场景的详细介绍:


1. 工厂模式(Factory Pattern)

  • 核心作用:解耦对象的创建与使用。
  • Spring 中的实现
    • BeanFactoryApplicationContext:Spring 的核心容器本身就是工厂模式的实现。BeanFactory 负责创建和管理 Bean 对象,开发者无需手动 new 对象,而是通过容器获取。
    • FactoryBean 接口:允许自定义复杂对象的创建逻辑(如 MyBatis 的 SqlSessionFactoryBean)。
  • 示例ApplicationContext.getBean("beanName") 通过工厂获取 Bean。

2. 单例模式(Singleton Pattern)

  • 核心作用:确保一个类只有一个实例,并提供全局访问点。
  • Spring 中的实现
    • 默认 Bean 作用域:Spring 默认将所有 Bean 配置为单例(通过 @Scope("singleton")),由容器管理生命周期。
    • 与传统单例的区别:Spring 的单例是容器级的(每个容器一个实例),而非 ClassLoader 级别的。
  • 示例:Service 层和 DAO 层的 Bean 通常设计为单例。

3. 代理模式(Proxy Pattern)

  • 核心作用:通过代理对象控制对真实对象的访问。
  • Spring 中的实现
    • AOP(面向切面编程):基于动态代理(JDK 动态代理或 CGLIB)实现日志、事务、安全等横切关注点。
    • @Transactional 注解:通过代理在方法前后添加事务管理逻辑。
  • 示例:声明式事务管理通过代理拦截目标方法。

4. 模板方法模式(Template Method Pattern)

  • 核心作用:定义算法骨架,将步骤延迟到子类实现。
  • Spring 中的实现
    • JdbcTemplateRestTemplate:封装数据库操作或 REST 调用的通用流程(如连接获取、异常处理),用户只需实现回调接口(如 RowMapper)。
  • 示例JdbcTemplate.query() 方法处理 SQL 执行,用户仅需提供 SQL 和结果映射逻辑。

5. 观察者模式(Observer Pattern)

  • 核心作用:定义对象间的一对多依赖,当一个对象状态变化时通知所有依赖者。
  • Spring 中的实现
    • 事件驱动模型:通过 ApplicationEvent(事件)、ApplicationListener(监听器)、ApplicationEventPublisher(发布者)实现。
    • 内置事件:如 ContextRefreshedEvent(容器刷新完成)、RequestHandledEvent(HTTP 请求处理完成)。
  • 示例:自定义事件 MyEvent,通过 publishEvent() 发布,由 @EventListener 监听处理。

6. 适配器模式(Adapter Pattern)

  • 核心作用:将一个接口转换为另一个客户端期望的接口。
  • Spring 中的实现
    • Spring MVC 的 HandlerAdapter:适配不同类型的 Controller(如 @ControllerHttpRequestHandler),统一调用 handleRequest() 方法。
    • RequestMappingHandlerAdapter:处理 @RequestMapping 注解的方法。
  • 示例:DispatcherServlet 通过 HandlerAdapter 调用不同 Controller 的方法。

7. 装饰者模式(Decorator Pattern)

  • 核心作用:动态地为对象添加额外功能。
  • Spring 中的实现
    • Bean 的包装类:如 BeanDefinitionDecorator 对 Bean 定义进行装饰。
    • HttpServletRequest 的包装类:例如 ContentCachingRequestWrapper
  • 示例:通过 BeanPostProcessor 对 Bean 进行增强(如添加日志)。

8. 策略模式(Strategy Pattern)

  • 核心作用:定义算法族,使其可互相替换。
  • Spring 中的实现
    • 资源加载Resource 接口的不同实现策略(如 ClassPathResourceUrlResource)。
    • 事务管理PlatformTransactionManager 的不同实现(如 JDBC、JTA、Hibernate 事务管理器)。
  • 示例:根据配置文件选择不同的事务管理策略。

9. 原型模式(Prototype Pattern)

  • 核心作用:通过复制现有对象创建新对象。
  • Spring 中的实现
    • Bean 作用域 prototype:每次请求 Bean 时返回新实例(通过 @Scope("prototype") 配置)。
  • 示例:需要多实例的 Bean(如用户会话对象)。

10. 责任链模式(Chain of Responsibility Pattern)

  • 核心作用:将请求沿处理链传递,直到被某个处理器处理。
  • Spring 中的实现
    • 拦截器链(Interceptor Chain):如 Spring MVC 的 HandlerInterceptor,多个拦截器按顺序处理请求。
    • 过滤器链(Filter Chain):在 Servlet 容器中处理 HTTP 请求。
  • 示例:用户认证、日志记录等拦截器依次处理请求。

11. 依赖注入(Dependency Injection, DI)

  • 核心作用:解耦对象间的依赖关系,由容器注入依赖。
  • Spring 中的实现
    • 构造器注入:通过 @Autowired 或 XML 配置。
    • Setter 注入:通过 @Autowired 注解 Setter 方法。
  • 示例:Service 层依赖 DAO 层对象,由 Spring 自动注入。

总结

Spring 框架通过灵活运用设计模式,实现了高度模块化、可扩展和低耦合的架构。理解这些模式在 Spring 中的应用场景,不仅有助于更高效地使用框架,还能提升代码设计能力。例如:

  • AOP 代理解决横切关注点,
  • 模板方法简化重复代码,
  • 依赖注入实现松耦合,
  • 观察者模式支持事件驱动编程。

这些模式共同支撑了 Spring 的核心功能(IoC、AOP、MVC 等),使其成为企业级开发的首选框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值