如果你正打算深入学习Spring,但是不知从何学起,那么我强烈推荐你可以按照这个系列做一遍。本系列将Spring框架的各个部分从它庞杂的代码体系中抽取出来,然后对每一个部分进行讲解,并最终搭建成简易版Spring。我以人格保证:如果你可以坚持做下来,那么你对Spring这块的知识就基本都掌握清楚了! 附上该系列地址:https://blog.csdn.net/zhang_qing_yun/article/details/120084497
Spring中的设计模式
工厂模式
Spring IOC也就是控制反转,将创建对象的控制权转移给Spring,由Spring创建实例和管理各个实例之间的依赖关系,其中,对象的创建就是通过 BeanFactory 和 ApplicationContext 完成的。
好处:把创建对象的任务交给工厂,从而将对象的创建和使用解耦开来;减少了代码的重复,Spring中创建对象是一个非常复杂的过程,但是使用工厂模式后,我们只需要对这个创建逻辑在工厂中编写一次即可。
单例模式
Spring中Bean的默认作用域就是singleton单例的,Spring通过三级缓存来管理单例对象。
单例模式的好处在于对一些重量级的对象,省略了重复创建对象花费的时间,减少了系统的开销;使用单例可以减少new操作的次数,减少了GC线程回收内存的压力。
策略模式
简单来说就是封装好一组策略,让客户端根据不同的条件选择不同的策略方式去解决问题。比如Spring的Resource类,针对不同的资源定义了不同的Resource的实现类,以此实现从不同的数据源来获取InputStream。我们看一张类图:
代理模式
AOP是Spring的一个核心特性(面向切面编程),作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。Spring AOP实现的关键在于动态代理,有两种方式:JDK动态代理和CGLIB动态代理。
模板模式
所谓模板就是一个方法,这个方法定义了算法的骨架,即将算法的实现定义成了一组步骤,并将一些步骤延迟到子类中实现,子类重写抽象类中的模板方法实现算法骨架中特定的步骤。。在模板方法模式中,我们可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,从而解决代码重复的问题。
Spring容器启动的时候调用的refresh()函数就是典型的模板方法,该函数规定了多个方法的执行顺序,然后其中的抽象方法由子类去实现。
适配器模式
作用就是将一个类的接口,转换成客户期望的另外一个接口。
Spring AOP中有一步是去获取拦截器链的过程,在这时Spring会通过适配器将Advisor转化为拦截器MethodInterceptor。
责任链模式
Spring AOP会将所有的拦截器组织成一条拦截器链,然后从头开始遍历调用这些拦截器的invoke方法。
观察者模式
Spring 事件驱动模型就是观察者模式很经典的一个应用。角色:事件、事件监听者、事件广播器。事件广播器中管理了所有注册的事件监听器,当我们要发布一个事件时,事件广播器就会去遍历所有的监听器,判断它监听的是不是该事件,如果是就执行其回调函数。
观察者模式的UML类图: