结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理

这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。

第七节、代理模式

一、代理模式介绍

代理模式有点像老大和小弟。主要解决的问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计模式经常会出现在我们的系统中。

类似的场景有:

  1. 数据库访问层面经常会提供一个较为基础的应用,以此来减少应用服务扩容时不至于数据库连接数暴增。
  2. 使用过的一些中间件:RPC框架,在拿到jar包对接口的描述后,中间件会在服务启动的时候生成对应的代理类,当调用接口的时候,实际是通过代理类发出的socket信息进行通过。
  3. mybatis:基本是定义接口但是不需要写实现类,就可以对xml或者自定义注解里的sql语句进行增删改查操作。

二、案例场景模拟

在本案例中我们模拟实现mybatis-spring中代理类生成部分

对于Mybatis的使用中只需要定义接口不需要实现类就可以完成增删改查操作,这是中间件开发的思想,只做业务开发对于spring的bean的定义一级注册和对代理以及反射调用的知识了解的相对较少。

三、代理类模式实现过程

接下来会使用代理类模式来模拟实现一个Mybatis中对类的代理过程,也就是只需要定义接口,就可以关联到方法注解中的sql语句完成对数据库的操作。

  1. BeanDefinitionRegistryPostProcessor:spring的接口类用于处理对bean的定义注册。
  2. GenericBeanDefinition:定义bean的信息,在mybatis-spring中使用到的是:ScannedGenericBeanDefinition略有不同。
  3. FactoryBean:用于处理bean工厂的类,这个类非常见。

1.工程结构

代理模式中间件模型结构

  1. 此模型中设计的类不多,都是抽离出来的核心处理类。主要的事情就是对类的代理和注册到spring中。
  2. 上图中最上面是关于中间件的实现部分,下面对应的是功能的使用。

2.代码实现

2.1自定义注解

这里我们定义了一个模拟mybatis-spring中的自定义注解,用于使用在方法层面

2.2Dao层接口
  1. 这里定义一个Dao层接口,并把自定义注解添加上。这和使用mybatis组件相同。
  2. 2.1和2.2是我们的准备工作,后面开始实现中间件功能部分。
2.3代理类定义