作为一枚程序员,如果不知道几个规划形式,出去面试都不好意思说自己技能牛了

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

不知道兄弟们有没有遇到过规划形式相关的面试题,我还记得很屡次的面试经验都涉及到了规划形式相关的标题。

今日咱们就一探究竟Spring顶用到了哪些规划形式。

一、单例形式

这个规划形式绝对是Spring中运用最多的一个规划形式之一,不接受任何辩驳

一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个
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名只会注册一个实例(单例)。

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

二、工厂形式

Spring容器便是运用简略工厂形式规划而成的。经过传入bean的称号或许类型获取bean的实例。

public interface BeanFactory {
	Object getBean(String name) throws BeansException;
	<T> T getBean(Class<T> requiredType) throws BeansException;
}

一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个
兄弟,上面这些类是不是很熟悉,哈哈,都是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);
      }
   }

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

四、代理形式

动态代理形式肯定不陌生,代理形式便是支撑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;
		}	
	}
}

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

五、模版办法形式

提到模版形式,通常的写法是不是定义一个抽象类,将固定的骨架写好,由各自的子类担任完成可变的部分,可是在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());
}

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

六、战略形式

在Spring中实例化Bean采用了战略形式,能够选择反射或许cglib组件两种战略构造一个类的实例。

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

七、适配器形式

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;
         }
      }
   }
}

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

八、享元形式

最终一个要介绍的便是享元形式了,如果项目中有一些不变的逻辑,而且运用场景非常多的状况,就像一些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的大佬们点赞,真的把规划形式使用的酣畅淋漓

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

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