八股设计模式

设计模式总结

设计模式:类之间的关系

IOC和DI

控制反转怎么理解呢? 举个例子:”对象a 依赖了对象 b,当对象 a 需要使用 对象 b的时候必须自己去创建。但是当系统引入了 IOC 容器后, 对象a 和对象 b 之前就失去了直接的联系。这个时候,当对象 a 需要使用 对象 b的时候, 我们可以指定 IOC 容器去创建一个对象b注入到对象 a 中”。 对象 a 获得依赖对象 b 的过程,由主动行为变为了被动行为,控制权反转,这就是控制反转名字的由来。

DI(Dependecy Inject,依赖注入)是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去。

代理模式

Java AOP的底层实现原理

使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。

SpringBoot、Mybatis中大量使用了反射机制,同时也大量使用了动态代理,动态代理的实现也依赖反射。还有Spring注解Spring注解(@Bean,@Value等)。

动态代理:SpringAOP、RPC(本地服务通过网络请求远程服务。为了实现本地到远程的通信,我们实现需要实现网络通信,处理其中可能的一场。为良好的代码设计和可维护性,将网络通信部分隐藏起来,指暴露给本地服务一个借口,通过该接口即可访问远程服务提供的功能,而不必过多关心通信部分的细节。)

  1. Spring 中都用到了那些设计模式?

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 装饰者设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式(before、after、afterreturn)、spring MVC 中也是用到了适配器模式适配`Controller(handlerAdapter作为期望借口,需要处理各个种类的controller)。

观察者,(比如微信用户是观察者,公众号时主题,然后主题里面聚合这些观察者,主题改变之后,通知观察者)。

IMG_0D774481C3CD-1.jpg

IMG_13CD90DA5F4B-1.jpg

享元模式:

线程池(里面有抽象享元类,还有工厂类里面放享元,然后工厂类可以使用单例模式实现)

Integer(默认先创建并缓存-128~127之间的Integer对象,当调用valueOf时如果参数在-128~127之间则计算下标并从缓存中返回,否则创建一个新的Integer)。

责任链模式:

JVM类加载的时候的双亲委派机制。

JVM系列(三):双亲委派机制笔记

黑马中,自定义Spring框架的使用

  1. 工厂类①①ClassPathXmlApplicationContext类,从xml文件中加载bean,由于继承自AbstractApplicationContext,所以是非延时加载的。

​ 2. 里面会有一个Map来存储Bean对象

​ 2. 首先,创建解析器相关类②②XmlBeanDefinitionReader类,里面会使用InputStream加载xml配置文件,

​ 3. 然后通过document.getRootElement和.elements方法来得到里面的bean的配置数据,如下解析完毕。

​ 3. ③③①BeanDefinition(bead对象名称id,类的全类名class,子标签数据②MutablePropertieValues(里面有 List<③propertyValue (name,ref,value)>))

​ 3. 解析完毕后将(id(bean的id),beanDefinition)放入注册表④④SimpleBeanDefinitionRegistry中

​ 2. 通过reader的到register,通过register的到beandefinition

​ 2. 解析beandefinition里面的数据,然后反射出对象,然后再依赖注入,如果里面的property有ref的,那需要递归的注入

​ 2. 注入完毕后,map对象放进去。

Spring IOC中用到的一些设计模式

工厂模式:工厂模式+配置文件的方式

单例模式:IOC管理的bean对象是单例的

模版方法模式:abstractapplicationcontext类中的finishbeaninitialization(方法调用了自类的getbea,因为getbean的实现和环境息息相关)

迭代器模式:对于MutablePropertyValues类定义使用到了迭代器模式,因为此类存储并管理PropertyValue对象,也属于一个容器。

Author: Jcwang

Permalink: http://example.com/2022/07/18/%E5%85%AB%E8%82%A1%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/