Spring中的设计模式

149 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

Spring中的设计模式

单例模式

spring容器中的bean默认已单例方式存在。spring容器中的对象在BeanFactory创建以后存在缓存中,获取对象实例的时候直接从缓存中获取,并注入到其他对象中。

工厂模式

spring创建bean对像BeanFactory。

// 部分逻辑代码
public abstract class AbstractBeanFactory implements ConfigurableBeanFactory{    
   /**  
    * 单例对象缓存map
    */    
   private final Map singletonCache=new HashMap();    
   public Object getBean(String name)throws BeansException{    
       return getBean(name,null,null);    
   }    
   public Object getBean(String name,Class requiredType,Object[] args)throws BeansException{    
 
      //synchronized 保证线程安全   
      synchronized(this.singletonCache){    
         sharedInstance=this.singletonCache.get(beanName);    
       }    
      if(sharedInstance!=null){    
         //返回缓存Bean实例    
         bean=getObjectForSharedInstance(name,sharedInstance);    
      }else{     
        RootBeanDefinition mergedBeanDefinition=getMergedBeanDefinition(beanName,false);   
        if(mergedBeanDefinition.isSingleton()){    
           synchronized(this.singletonCache){      
             sharedInstance=this.singletonCache.get(beanName);    
             if(sharedInstance==null){    
               try {    
                  //创建Bean实例    
                  sharedInstance=createBean(beanName,mergedBeanDefinition,args);    
                  //添加到缓存
                   addSingleton(beanName,sharedInstance);    
               }catch (Exception ex) {    
               }finally{    
              }    
             }    
           }    
          bean=getObjectForSharedInstance(name,sharedInstance);    
        }    
}    
   return bean;    
}    
}

原型模式

需要将相同的属性从对象A的属性复制到对象B,使用BeanUtils.copyProperty

ClassA a = new ClassA();
// ...
ClassA b = new ClassB();
BeanUtils.copyProperties(a,b);

注意属性类型属性名称必须完全相同才能拷贝。通过Java的反射进行的拷贝。

适配器模式

HandlerAdapter

DispatcherServlet中的doDispatch方法,通过HandlerAdapter将请求分发到具体的controller。

public interface HandlerAdapter {

	boolean supports(Object handler);

	@Nullable
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

	long getLastModified(HttpServletRequest request, Object handler);

}

spring定义了一个适配器接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了。

WebMvcConfigurerAdapter

WebMvcConfigurerAdapter 实现了接口WebMvcConfigurer,是spring的核心配置类,在之前的版本通常继续此类进行项目配置。此适配器默认实现了接口的方法,在使用的时候只需关心需要的配置,重写方法即可。在java8之后接口有了默认实现,抽象接口的空实现适配器方式也就是失去了其作用,直接实现接口,只关心需要的方法重写,不需要的方法走接口的默认实现。

过滤器模式

Filter 过滤器

最直接的便是Filter过滤器。实现Filter接口,实现dofilter方法。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}
HandlerInterceptor 拦截器

HandlerInterceptor 拦截器也是过滤器模式的实现,多个过滤器通过Order进行排序或者手动注册的顺序,分别进行请求数据、返回数据的处理。

装饰器模式

Spring WrapperBeanWrapper 是一个包装类接口,其实现类BeanWrapperImpl 接收一个Object对象进行包装处理。

代理模式

动态代理是spring中的重要应用。Spring中的AOP,事务 @Transactional,Spring cloud 的OpenFeign都是动态代理的应用。

观察者模式

spring中的ApplicationContext上下文内容变化的时候,会通过ApplicationEvent像所有监听事件的观察者EventListener发布消息。此过程在SpringApplication.run() 启动过程查看源码尤为明显。

策略模式

Spring中的属性配置大多是通过策略模式实现的。

VersionStrategy 有两个最终实现类 ContentVersionStrategy FixedVersionStrategy

Mvc模式

SpringMvc是一种基于Java实现的Mvc设计模型的请求驱动类型的轻量级Web框架。前端端分离场景,视图层已分离。传统的jsp、Thymeleaf 是经典的MVC模式。