Java面试必备:Spring框架中常用的设计模式解析

Java面试题 - 你了解的Spring都用到哪些设计模式?

回答重点

  1. 工厂模式,从名字就能看出来是BeanFactory,整个Spring 1OC就是一个工厂。
  2. 模板方法,例如JdbcTemplate、RestTemplate,名字是xxxTemplate 的都是模板。
  3. 代理模式,AOP整个都是代理模式。
  4. 单例模式,默认情况下Bean 都是单例的。
  5. 责任链模式,比如Spring MVC中的拦截器,多个拦截器串联起来就形成了责任链。
  6. 观察者模式,在Spring中的监听器实现。
  7. 适配器模式,在Spring MVC中提到的handlerAdapter其实就是适配器。

引言

Spring框架作为Java企业级开发的事实标准,其内部大量运用了经典的设计模式。理解这些设计模式不仅能帮助我们更好地使用Spring,也能提升我们的架构设计能力。本文将介绍Spring中常用的设计模式及其应用场景。

1. 工厂模式(Factory Pattern)

工厂模式在Spring中最直接的体现就是IoC容器本身。Spring使用BeanFactory和ApplicationContext来创建和管理bean对象。

BeanFactory
+getBean(name)
ApplicationContext
+getBean(name)
DefaultListableBeanFactory
ClassPathXmlApplicationContext

Spring通过配置文件或注解定义bean,然后由容器负责实例化,而不是直接在代码中new对象,这降低了耦合度。

2. 单例模式(Singleton Pattern)

Spring默认情况下管理的bean都是单例的,即一个容器中只有一个实例。

// Spring默认配置下的单例行为
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
Object bean1 = context.getBean("someBean");
Object bean2 = context.getBean("someBean");
System.out.println(bean1 == bean2); // 输出true

3. 代理模式(Proxy Pattern)

Spring AOP的实现就大量使用了代理模式。当我们需要为某个类添加横切关注点(如事务、日志)时,Spring会动态创建代理对象。

ClientProxyTarget调用方法前置处理方法执行结果后置处理后返回结果ClientProxyTarget

Spring使用两种代理方式:

  • JDK动态代理:基于接口
  • CGLIB代理:基于类继承

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

Spring提供了多种模板类来简化开发,如JdbcTemplate、RestTemplate等。

开始
定义算法骨架
具体步骤由子类实现
执行算法
结束

以JdbcTemplate为例,它处理了JDBC的流程(获取连接、创建语句、执行SQL、处理异常、释放资源),而我们只需要关注SQL和结果处理。

5. 观察者模式(Observer Pattern)

Spring的事件驱动模型基于观察者模式实现,包括ApplicationEvent、ApplicationListener和ApplicationEventPublisher。

PublisherEventListener1Listener2发布事件通知事件通知事件处理完成处理完成PublisherEventListener1Listener2

6. 适配器模式(Adapter Pattern)

Spring MVC中的HandlerAdapter就是适配器模式的典型应用,它使得不同类型的处理器(Controller)能够以统一的方式被调用。

HandlerAdapter
+supports(handler)
+handle(request, response, handler)
SimpleControllerHandlerAdapter
RequestMappingHandlerAdapter

7. 装饰器模式(Decorator Pattern)

Spring在事务管理、缓存等方面使用了装饰器模式。例如,TransactionAwareCacheDecorator就是对Cache的装饰。

// 伪代码示例
public class TransactionAwareCacheDecorator implements Cache {
    private final Cache targetCache;
    
    // 装饰原有方法
    public ValueWrapper get(Object key) {
        // 添加事务相关逻辑
        return targetCache.get(key);
    }
}

8. 策略模式(Strategy Pattern)

Spring在资源访问(Resource接口)、缓存管理(CacheManager)等方面使用了策略模式。

Resource
+getInputStream()
UrlResource
ClassPathResource
FileSystemResource

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

Spring Security的过滤器链和Spring MVC的拦截器链都是责任链模式的实现。

Request
Filter1
Filter2
Filter3
Servlet
Response

总结

Spring框架巧妙地运用了各种设计模式,使其具有高度的灵活性和扩展性。理解这些设计模式在Spring中的应用,不仅能帮助我们更好地使用框架,也能提升我们的架构设计能力。下表总结了Spring中主要的设计模式应用:

设计模式Spring中的应用场景
工厂模式BeanFactory, ApplicationContext
单例模式Bean的默认作用域
代理模式AOP实现
模板方法JdbcTemplate, RestTemplate等
观察者模式事件驱动模型
适配器模式HandlerAdapter
装饰器模式事务管理、缓存装饰
策略模式资源访问策略
责任链模式过滤器链、拦截器链

掌握这些设计模式的应用,将使我们能够更深入地理解Spring框架的设计哲学,并在自己的项目中灵活运用这些模式解决实际问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值