一起养成写作习惯!这是我参与「掘金日新计划 · 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模式。