“万恶之源”的动态代理

 

前言

最近准备整理一下框架学习的只是,发现不管是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客户端调用测试


                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信