吐血整理!最全Spring设计模式总结

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 吐血整理!最全Spring设计模式总结

前言

Spring作为web后端开发者不可绕开的技术框架之一,其优秀的设计模式铸就了其高扩展性和高性能。目前,业内围绕设计模式这一块,共总结了有27种设计模式。就Spring框架而言,依据其功能设计,本文总结了其中所涉及到的设计模型。从Spring的具体功能代码中分析总结出其中所涉及的设计模型,有例子有理论,本文内容较多,干货满满!强烈推荐收藏,以备不时之需

891941f463d132dd098de6631653b049.png


🍕工厂模式

1、应用举例

1、 BeanFactory:Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建

还是传入参数前创建这个要根据具体情况来定。

2、FactoryBean:Spring中的FactoryBean接口的bean是一类叫做factory的bean。其特点是:spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这 个bean.getOjbect()方法的返回值。


2、功能解析

在Spring框架中,对于以上两个类的使用场景可以说是框架的重中之重!以下将依据两者在系统的中的应用,帮助你更深入的理解其中的设计之美:

1、BeanFactory对象的使用,可以说BeanFactory对象的设计,完全覆盖了Spring框架中的每一个对象的生成过程。其作用范围可以从以下两个角度进行分析:一是获取框架中自带的Bean对象,二是往框架中塞入自定义个Bean对象。

(1) 在Spring容器启动阶段:

764ce81f08852f318a3446e602e199a2.png

(2) 容器中bean的实例化阶段:实例化阶段主要是通过反射或者CGLIB对bean进行实例化,在这个阶段Spring又给我们暴露了很多的扩展点,正是通过继承这些扩展点,让我们可以把自己自定义的Bean放入到容器中。

bf3dac1f932eda4a94416cae4fa9dacd.png


3、设计原理

1、松耦合。可以将原来硬编码的依赖,通过Spring这个beanFactory这个

工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入

了第三方——spring这个beanFactory,由它来解决bean之间的依赖

问题,达到了松耦合的效果.

2、bean的额外处理。通过Spring接口的暴露,在实例化bean的阶段我们

可以进行一些额外的处理,这些额外的处理只需要让bean实现对应的

接口即可,那么spring就会在bean的生命周期调用我们实现的接口来

处理该bean。


🍔单例模式

1、应用举例

Spring依赖注入Bean实例默认是单例的。


2、功能解析

我们从底层原理分析可以得出:Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean中的doGetBean方法底层是调用getSingleton进行bean的创建。


所以,我们直接看getSingleton()方法的源码便可以领略到其中的精髓:

 public Object getSingleton(String beanName){
2 //参数true设置标识允许早期依赖
3 return getSingleton(beanName,true);
4 }
5 protected Object getSingleton(String beanName, boolean allowEarl
yReference) {
6 //检查缓存中是否存在实例
7 Object singletonObject = this.singletonObjects.get(beanName);
8 if (singletonObject == null && isSingletonCurrentlyInCreation(be
anName)) {
9 //如果为空,则锁定全局变量并进行处理。
10 synchronized (this.singletonObjects) {
11 //如果此bean正在加载,则不处理
12 singletonObject = this.earlySingletonObjects.get(be
anName);
13 if (singletonObject == null && allowEarlyReference) {
14 //当某些方法需要提前初始化的时候则会调用addSingleFactory 方法将对应
的ObjectFactory初始化策略存储在singletonFactories
15 ObjectFactory singletonFactory = this.singleton
Factories.get(beanName);
16 if (singletonFactory != null) {
17 //调用预先设定的getObject方法
18 singletonObject = singletonFactory.getObjec
t();
19 //记录在缓存中,earlysingletonObjects和singletonFactories互斥
20 this.earlySingletonObjects.put(beanName, singletonObject);
21 this.singletonFactories.remove(beanName);
22 }
23 }
24 }
25 }
26 return (singletonObject != NULL_OBJECT ? singletonObject : null)
27 }

3、设计原理

保证一个类仅有一个实例,并提供一个访问它的全局访问点。


🍟适配器模式

1、应用举例

SpringMVC中的适配器HandlerAdatper


2、功能解析

HandlerAdatper根据Handler规则执行不同的Handler。

DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。

HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕

后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。

2cf411ae82567cecbdbe6d796295e910.png


3、设计原理

HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的

Handler和一个对应的HandlerAdapter即可。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的

适配器实现类,让适配器代替controller执行相应的方法。这样在扩展

Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展

了。


🌭装饰器模式

1、应用举例

Spring中用到的装饰器模式在类名上有两种表现:

  • 一种是类名中含有Wrapper
  • 另一种是类名中含有Decorator


2、功能解析

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。


3、设计原理

动态地给一个对象添加一些额外的职责。

就增加功能来说,Decorator模式相比生成子类更为灵活。


🍿代理模式

1、应用举例

AOP底层,就是动态代理模式的实现。


2、功能解析

  • 动态代理:
    在内存中构建的,不需要手动编写代理类
  • 静态代理:
    需要手工编写代理类,代理类引用被代理对象。


3、设计原理

切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器

会为目标对象创建动态的创建一个代理对象。SpringAOP就是以这种

方式织入切面的。

织入:把切面应用到目标对象并创建新的代理对象的过程。

相关文章
|
6月前
|
设计模式 SQL Java
Spring中的设计模式
Spring中的设计模式
|
21天前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
3月前
|
设计模式 SQL Java
一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个
该文章主要介绍了Spring框架中使用的设计模式,并列举了一些常见的设计模式及其在Spring框架中的应用。
一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个
|
3月前
|
设计模式 缓存 Java
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
|
5月前
|
设计模式 Java 程序员
Spring用到了哪些设计模式?
Spring用到了哪些设计模式?
39 1
|
6月前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
272 3
|
6月前
|
设计模式 Java 数据库连接
Spring Framework 6 中的设计模式
Spring Framework 6 中的设计模式
43 1
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。