Spring中的设计模式snailclimb.gitee.io

推荐系列视频


blibli-图解Java设计模式-韩顺平老师www.bilibili.com

面试官:Spring 中常见的设计模式有哪些?

1.单例模式

单例模式,就是采取一定的方法,保证在整个软件系统中, 对某个类只能存在一个对象实例,并且该类只提供一个获取该对象实例的方法。

Spring 中 bean 的默认作用域就是 singleton(单例)的。

2.工厂模式

Spring使用工厂模式可以通过 BeanFactoryApplicationContext 创建 bean 对象。

3.模板方法模式

Spring IOC 容器初始化的过程中,用到了模板方法模式

在它的AbstractApplicationContext类中的方法里,有一个onRefresh()方法。该方法就是一个模板方法。

同时,Spring 中jdbcTemplatehibernateTemplate等以 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


spring给实体添加默认值 spring默认模式_软件系统兼容性设计


7.代理模式

代理模式:为目标类生成一个对应的代理类,以控制这个对象的访问。这种方法可以拓展目标对象的功能。

在Spring中,Spring Aop是基于动态代理来实现的。


总结

Spring 框架中用到了哪些设计模式?

  • 工厂模式 :
  • Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 代理模式
  • 单例模式
  • 模板方法模式 :
  • Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 装饰者模式 :
  • 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式:
  • 适配器模式 :
  • Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller