Spring中的设计模式snailclimb.gitee.io
推荐系列视频
blibli-图解Java设计模式-韩顺平老师www.bilibili.com
面试官:Spring 中常见的设计模式有哪些?
1.单例模式
单例模式,就是采取一定的方法,保证在整个软件系统中, 对某个类只能存在一个对象实例,并且该类只提供一个获取该对象实例的方法。
Spring 中 bean 的默认作用域就是 singleton(单例)的。
2.工厂模式
Spring使用工厂模式可以通过 BeanFactory
或 ApplicationContext
创建 bean 对象。
3.模板方法模式
在Spring IOC 容器初始化的过程中,用到了模板方法模式。
在它的AbstractApplicationContext类中的方法里,有一个onRefresh()方法。该方法就是一个模板方法。
同时,Spring 中jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。一般情况下,我们都是使用继承的方式来实现模板模式,但是 Spring 并没有使用这种方式,而是使用Callback 模式与模板方法模式配合,既达到了代码复用的效果,同时增加了灵活性。
视频-Spring IOC中模板方法模式代码分析www.bilibili.com
4.观察者模式
观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以解耦我们的代码。
视频-观察者模式在JDK中的源码分析-Observablewww.bilibili.com
5.适配器模式
适配器模式(Adapter Pattern)是将某个类的接口转换成客户端期望的另一个接口表示。主要的目的是兼容性。让本来接口不匹配不能一起工作的两个类可以协调工作。其别名为Wrapper(包装器)。
适配器模式属于结构模式,主要分为三类:类适配器模式,对象适配器模式,接口适 配器模式。
视频-图解类适配器模式www.bilibili.com
spring AOP中的适配器模式
在Spring AOP 中,其实现是基于代理模式的。但是,在Spring AOP的增强或者通知(Advice)中,使用到了适配器模式。与之相关的适配器模式为AdvisorAdapter。
Advice常用的类型有:
BeforeAdvice、AfterAdvice、AfterReturingAdvice等。
每一个类型的通知,都有对应的拦截器:
MethodBeforeAdviceInterceptor,AfterReturingAdviceAdapter,AfterReturningAdviceInterceptor等。
Spring预定义的通知,要通过对应的适配器,适配成MethodInterceptor接口类型的对象。
如:MethodBeforeAdviceInterceptor 负责适配 MethodBeforeAdvice
6.装饰者模式
装饰者模式的定义:
装饰者模式可以动态地给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。简单点儿说就是当我们需要修改原有的功能,但我们又不愿直接去修改原有的代码时,设计一个Decorator套在原有代码外面。装饰者模式体现了开闭原则。在实际中,是采用继承加组合的方式来实现。
视频-装饰者模式解释www.bilibili.com
JDK 的装饰者模式
比如InputStream
家族,InputStream
类下有FileInputStream
(读取文件)、BufferedInputStream
(增加缓存,使读取文件速度大大提升)等子类都在不修改InputStream
代码的情况下扩展了它的功能。
视频-装饰者模式在IO流中的分析www.bilibili.com
Spring中 DataSource中的装饰者模式
我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往在spring和hibernate框架中总是配置一个数据源,因而sessionFactory的dataSource属性总是指向这个数据源并且恒定不变,所有DAO在使用sessionFactory的时候都是通过这个数据源访问数据库。
但是如果由于项目的需要,我们的DAO在访问sessionFactory的时候都不得不在多个数据源中不断切换。那么,如何根据用户的需求,使得sessionFactory可以动态的切换不同的数据源?
如果sessionFactory指向的dataSource可以根据客户的需求去连接客户所需要的真正的数据源,即提供动态切换数据源的功能,那么问题就解决了。
使用装饰者模式的思路是:首先写一个Decorator类,取名叫MultiDataSource,通过它来动态切换数据源。同时在配置文件中将sessionFactory的dataSource属性由原来的某个具体的dataSource改为MultiDataSource。通过MultiDataSource封装了具体的dataSource,并实现了数据源动态切换。
装饰者模式来实现多数据源 - 张玉龙 - 博客园www.cnblogs.com
7.代理模式
代理模式:为目标类生成一个对应的代理类,以控制这个对象的访问。这种方法可以拓展目标对象的功能。
在Spring中,Spring Aop是基于动态代理来实现的。
总结
Spring 框架中用到了哪些设计模式?
- 工厂模式 :
- Spring使用工厂模式通过
BeanFactory
、ApplicationContext
创建 bean 对象。
- 代理模式
- 单例模式
- 模板方法模式 :
- Spring 中
jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 装饰者模式 :
- 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式:
- 适配器模式 :
- Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配
Controller
。