Java面试题 - 你了解的Spring都用到哪些设计模式?
回答重点
- 工厂模式,从名字就能看出来是BeanFactory,整个Spring 1OC就是一个工厂。
- 模板方法,例如JdbcTemplate、RestTemplate,名字是xxxTemplate 的都是模板。
- 代理模式,AOP整个都是代理模式。
- 单例模式,默认情况下Bean 都是单例的。
- 责任链模式,比如Spring MVC中的拦截器,多个拦截器串联起来就形成了责任链。
- 观察者模式,在Spring中的监听器实现。
- 适配器模式,在Spring MVC中提到的handlerAdapter其实就是适配器。
引言
Spring框架作为Java企业级开发的事实标准,其内部大量运用了经典的设计模式。理解这些设计模式不仅能帮助我们更好地使用Spring,也能提升我们的架构设计能力。本文将介绍Spring中常用的设计模式及其应用场景。
1. 工厂模式(Factory Pattern)
工厂模式在Spring中最直接的体现就是IoC容器本身。Spring使用BeanFactory和ApplicationContext来创建和管理bean对象。
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会动态创建代理对象。
Spring使用两种代理方式:
- JDK动态代理:基于接口
- CGLIB代理:基于类继承
4. 模板方法模式(Template Method Pattern)
Spring提供了多种模板类来简化开发,如JdbcTemplate、RestTemplate等。
以JdbcTemplate为例,它处理了JDBC的流程(获取连接、创建语句、执行SQL、处理异常、释放资源),而我们只需要关注SQL和结果处理。
5. 观察者模式(Observer Pattern)
Spring的事件驱动模型基于观察者模式实现,包括ApplicationEvent、ApplicationListener和ApplicationEventPublisher。
6. 适配器模式(Adapter Pattern)
Spring MVC中的HandlerAdapter就是适配器模式的典型应用,它使得不同类型的处理器(Controller)能够以统一的方式被调用。
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)等方面使用了策略模式。
9. 责任链模式(Chain of Responsibility Pattern)
Spring Security的过滤器链和Spring MVC的拦截器链都是责任链模式的实现。
总结
Spring框架巧妙地运用了各种设计模式,使其具有高度的灵活性和扩展性。理解这些设计模式在Spring中的应用,不仅能帮助我们更好地使用框架,也能提升我们的架构设计能力。下表总结了Spring中主要的设计模式应用:
| 设计模式 | Spring中的应用场景 |
|---|---|
| 工厂模式 | BeanFactory, ApplicationContext |
| 单例模式 | Bean的默认作用域 |
| 代理模式 | AOP实现 |
| 模板方法 | JdbcTemplate, RestTemplate等 |
| 观察者模式 | 事件驱动模型 |
| 适配器模式 | HandlerAdapter |
| 装饰器模式 | 事务管理、缓存装饰 |
| 策略模式 | 资源访问策略 |
| 责任链模式 | 过滤器链、拦截器链 |
掌握这些设计模式的应用,将使我们能够更深入地理解Spring框架的设计哲学,并在自己的项目中灵活运用这些模式解决实际问题。

4万+

被折叠的 条评论
为什么被折叠?



