前言
最近准备整理一下框架学习的只是,发现不管是RPC框架,还是Spring的框架,Mybatis的框架都有很多地方地方用到了动态代理的方式,例如我们强大的Spring AOP、Mybatis中的接口方法查询都是用到了JDK动态代理,为了后期巩固知识的方便,我希望自己能从基础入手,真正理解框架。也要求自己以这样的方式来记录学习/复习过程。
一、代理模式
1.1什么是代理模式?
代理模式的定义:代理模式是指给某一个对象提供一个代理对象,并由代理对象来控制对原对象(被代理)的引用。引战的说法就是,婚介所来介绍对象🙂
1.3代理模式分类
如果按照代理创建的时期来分类的话,可以分成静态代理和动态代理。
- 静态代理:由程序员创建或者特定的工具自动生成的源码,程序运行之前,代理类的字节码文件已经创建好了。
- 动态代理:通过反射机制动态创建,在程序运行时才创建。
二、静态代理
实现静态代理有四个步骤:
- 定义业务接口
- 被代理的类来实现业务接口
- 定义代理类并实现业务接口
- 客户端调用
下面我们将按照这个步骤来实现一个静态代理,仿照AOP,我们来实现一个记录数据库插入数据的前后日志需求。
2.1定义业务接口
IService.java
package com.proxy.stat; /** * created with IntelliJ IDEA. * packageName : com.proxy.stat * author : wujw * date : 2018/9/12 21:47 * version : 1.0.0 * description : 业务接口 */ public interface IService { /** * 将数据库插入一条数据 * @param data data */ void insert(String data); }2.2被代理类实现业务接口
ServiceImpl.java
package com.proxy.stat; /** * created with IntelliJ IDEA. * packageName : com.proxy.stat * author : wujw * date : 2018/9/12 21:50 * version : 1.0.0 * description : 被代理类实现业务接口 */ public class ServiceImpl implements IService{ public void insert(String data) { System.out.println("insert into database : "+ data); } }2.3定义代理类并实现业务接口
ServiceProxy.java
package com.proxy.stat; /** * created with IntelliJ IDEA. * packageName : com.proxy.stat * author : wujw * date : 2018/9/12 21:52 * version : 1.0.0 * description : 代理类并实现业务接口 */ public class ServiceProxy implements IService{ //被代理对象 private IService iService; //构造方式注入 public ServiceProxy(final IService iService) { this.iService = iService; } public void insert(String data) { System.out.println("ready to insert into database"); iService.insert(data); System.out.println("insert into database success"); } }2.4客户端调用测试
