一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个

简介: 该文章主要介绍了Spring框架中使用的设计模式,并列举了一些常见的设计模式及其在Spring框架中的应用。

一、单例模式

这个设计模式绝对是Spring中使用最多的一个设计模式之一,不接受任何反驳

OzWI8Fe5M3PVRhP0QAgTqmDycacUQdkZ.jpeg beans模块,context模块,aop模块,mvc模块等多个模块都能见着他的身影。 最经典的用法就是Spring容器在注册单例bean对象的实现中

//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
protected void addSingleton(String beanName, Object singletonObject) {
   
   
   //加锁
   synchronized (this.singletonObjects) {
   
   
      this.singletonObjects.put(beanName, singletonObject);
   }
}

兄弟,看到了吧?Spring通过加锁和一个Map保证一个bean名只会注册一个实例(单例)。 101909bnesqpvioo8l7ywr.jpeg

二、工厂模式

Spring容器就是使用简单工厂模式设计而成的。通过传入bean的名称或者类型获取bean的实例。

public interface BeanFactory {
   
   

    Object getBean(String name) throws BeansException;


    <T> T getBean(Class<T> requiredType) throws BeansException;
}

image.png 兄弟,上面这些类是不是很熟悉,哈哈,都是Spring容器核心成员。

三、装饰器模式

这个模式也是Spring团队使用比较多的设计模式。 比如下面是一个被装饰了线程执行错误处理能力的Runnable,对Runnable的能力进行了增强。

public class DelegatingErrorHandlingRunnable implements Runnable {
   
   

   private final Runnable delegate;

   private final ErrorHandler errorHandler;

   @Override
   public void run() {
   
   
      try {
   
   
         this.delegate.run();
      }
      catch (UndeclaredThrowableException ex) {
   
   
         this.errorHandler.handleError(ex.getUndeclaredThrowable());
      }
      catch (Throwable ex) {
   
   
         this.errorHandler.handleError(ex);
      }
   }

u=1538836276,790175251&fm=253&fmt=auto&app=138&f=JPEG.webp

四、代理模式

动态代理模式肯定不陌生,代理模式就是支撑aop模块能够实现的底层技术。 下面的写法见过吗?

final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {
   
   

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
   

        try {
   
   
            TargetSource targetSource = this.advised.targetSource;
            target = targetSource.getTarget();
            Object retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args);
            return retVal;
        }    
    }
}

b64da6adly1gzm2e2lkgvj20j40igq4j.jpeg

五、模版方法模式

说到模版模式,通常的写法是不是定义一个抽象类,将固定的骨架写好,由各自的子类负责实现可变的部分,但是在Spring中不得不提JdbcTemplate, org.springframework.jdbc.core.JdbcTemplate Spring将执行sql的流程骨架实现,将可变的sql通过回调形式的参数传入,体现了模版方法模式的另外一种实现。JmsTemplate,HibernateTemplate都使用到了这种设计模式。

public void execute(final String sql) throws DataAccessException {
   
   

   class ExecuteStatementCallback implements StatementCallback<Object>, SqlProvider {
   
   
      @Override
      public Object doInStatement(Statement stmt) throws SQLException {
   
   
         stmt.execute(sql);
         return null;
      }
      @Override
      public String getSql() {
   
   
         return sql;
      }
   }

   execute(new ExecuteStatementCallback());
}

u=1999703385,3319683277&fm=253&fmt=auto&app=138&f=GIF.gif

六、策略模式

在Spring中实例化Bean采用了策略模式,可以选择反射或者cglib组件两种策略构造一个类的实例。

image.png

七、适配器模式

SpringMvc模块通过适配器模式将HandlerMapping转换为HandlerAdapter,在HandlerAdapter实现Http请求接收与结果处理。

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
   if (this.handlerAdapters != null) {
      for (HandlerAdapter adapter : this.handlerAdapters) {
         if (adapter.supports(handler)) {
            return adapter;
         }
      }
   }
}

image.png

八、享元模式

最后一个要介绍的就是享元模式了,如果项目中有一些不变的逻辑,而且使用场景非常多的情况,就像一些Class的元数据信息,这些信息不变,但是经常使用,享元模式类似缓存一样的功能,下次还可以从缓存拿出来继续使用 快看下面SpringMvc模块中参数解析器这种写法,真的是爱了,如果没有使用这种模式,每次http请求过来都重新查找和构造一次参数解析器,那么系统内存和性能将有非常大的挑战。

public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
   
   

   private final List<HandlerMethodArgumentResolver> argumentResolvers = new LinkedList<>();

   private final Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache =
         new ConcurrentHashMap<>(256);

   @Nullable
   private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
   
   
      HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
      if (result == null) {
   
   
         for (HandlerMethodArgumentResolver resolver : this.argumentResolvers) {
   
   
            if (resolver.supportsParameter(parameter)) {
   
   
               result = resolver;
               //下次还需要使用,缓存起来
               this.argumentResolverCache.put(parameter, result);
               break;
            }
         }
      }
      return result;
   }
}

看到Spring团队使用了这么多设计模式,心中默默的给Spring的大佬们点赞👍,真的把设计模式应用的淋漓尽致

a6a681ebgy1gp0zftsbcqj20c80c8t9g.jpeg

如果您喜欢这个文章,麻烦用您的发财小手一键三连,点赞关注转发就是对我最大的支持。

相关文章
|
7月前
|
设计模式 SQL Java
Spring中的设计模式
Spring中的设计模式
|
2月前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
3月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
4月前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
4月前
|
设计模式 缓存 Java
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
|
6月前
|
设计模式 Java 程序员
Spring用到了哪些设计模式?
Spring用到了哪些设计模式?
49 1
|
7月前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
382 3
|
7月前
|
设计模式 Java 数据库连接
Spring Framework 6 中的设计模式
Spring Framework 6 中的设计模式
48 1
|
设计模式 缓存 Java
Spring 框架中都用到了哪些设计模式
Spring框架采用了多种设计模式来实现自己的功能,这主要是为了解决一些常见的软件开发问题。以下是一些Spring框架中使用设计模式的原因:
66 0
下一篇
DataWorks