JDK动态代理,代理接口没有实现类,实现动态代理方式

JDK代理,代理的是接口,那么笔者想一想,既然代理的是接口,那如果没有实现类怎么办,能不能代理。答案是可以的,Mybatis就是这样的。

Mybatis使用JDK动态代理来实现Mapper接口,事先保存好Mapper接口,和接口声明的方法,返回值,参数类型,然后代理类的方法调用的时候使用MapperMethod这个事先放入方法缓存里的对象来真实调用功能。

笔者极度简化了一下代码:

被代理的接口:

public interface Subject2 {

    String selectById();
}

这个接口可以看成是Mapper接口

代理对象:

public class SubjectProxy2<T> implements InvocationHandler {

    private Class<T> proxyInterface;
    //这里可以维护一个缓存,存这个接口的方法抽象的对象

    SubjectProxy2(Class<T> proxyInterface){
        this.proxyInterface = proxyInterface;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("selectById")){
            //String result = (String) method.invoke(proxyInterface,args);
            //这里可以得到方法抽象对象来调用真的的查询方法
            System.out.println("selectById调用成功");
        }
        return null;
    }

    public T getProxy(){
        return (T) Proxy.newProxyInstance(proxyInterface.getClassLoader(),new Class[]{proxyInterface},this);
    }
}

这个代理类使用了泛型,说明这个代理类可以代理所有的mapper接口。

那么接下来测试一下:

public class ProxyTest2 {

    public static void main(String[] args) {
        SubjectProxy2<Subject2> subjectProxy2 = new SubjectProxy2(Subject2.class);
        Subject2 subject2 = subjectProxy2.getProxy();
        subject2.selectById();
    }
}

结果不言而喻。肯定会有相应的输出

没有看mybatis源码的时候,我以为动态代理一定要要有实现类才能代理,但是看了优秀的顶级大牛的源码之后,我才发现,原来还可以这样。

(0)

相关推荐

  • Java JDK 动态代理的使用方法示例

    本文主要和大家分享介绍了关于Java JDK 动态代理使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 前言 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现. JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文

  • Java JDK动态代理(AOP)用法及实现原理详解

    Java-JDK动态代理(AOP)使用及实现原理分析 第一章:代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 后面我们在用Spirng和Mybatis的时候,要理解怎么使用的. 1.什么是代理? 代理,在我们日常生活之中就有体现,代购,中介,换ip,商家等等. 比如有一家美国的大学,可以对全世界招生.留学中介(代理 ) 留学中介(代理):帮助这家美国的学校招生,中介是学校的代理中介是代替学校完成招生功能 代理特点

  • Java JDK动态代理实现原理实例解析

    JDK动态代理实现原理 动态代理机制 通过实现 InvocationHandler 接口创建自己的调用处理器 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入 Interface InvocationHandler 该接口中仅定义了一个方法Object:invoke(Object obj,Method m

  • Java JDK动态代理的基本原理详细介绍

    JDK动态代理详解 本文主要介绍JDK动态代理的基本原理,让大家更深刻的理解JDK Proxy,知其然知其所以然.明白JDK动态代理真正的原理及其生成的过程,我们以后写JDK Proxy可以不用去查demo,就可以徒手写个完美的Proxy.下面首先来个简单的Demo,后续的分析过程都依赖这个Demo去介绍,例子采用JDK1.8运行. JDK Proxy HelloWorld package com.yao.proxy; /** * Created by robin */ public inter

  • 深入讲解基于JDK的动态代理机制

    前言 『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所以你可以将你的请求数据报发送到那些没有被屏蔽的国外主机上,然后你通过配置国外主机将请求转发到目的地并在得到响应报文后转发回我们国内主机上. 这个例子中,国外主机就是一个代理对象,而那些被墙掉的主机就是真实对象,我们不能直接访问到真实对象,但可以通过一个代理间接的访问到. 代理模式的一个好处就是

  • JDK动态代理,代理接口没有实现类,实现动态代理方式

    JDK代理,代理的是接口,那么笔者想一想,既然代理的是接口,那如果没有实现类怎么办,能不能代理.答案是可以的,Mybatis就是这样的. Mybatis使用JDK动态代理来实现Mapper接口,事先保存好Mapper接口,和接口声明的方法,返回值,参数类型,然后代理类的方法调用的时候使用MapperMethod这个事先放入方法缓存里的对象来真实调用功能. 笔者极度简化了一下代码: 被代理的接口: public interface Subject2 { String selectById(); }

  • 使用Spring特性实现接口多实现类的动态调用方式

    目录 正好用到.mark一下背景 问题的提出 首先我们看一下这个方法的签名 接下来看看我们遇到的问题是什么? 实现 代码如下 验证 关于SPI 下面是JDBC驱动的接口 下面是MySQL的JDBC驱动实现的SPI配置 正好用到.mark一下背景 org.springframework.beans及org.springframework.context这两个包是Spring IoC容器的基础,其中重要的类有BeanFactory,BeanFactory是IoC容器的核心接口,其职责包括:实例化.定

  • 在AOP中Spring生成代理类的两种方式

    Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类: 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型: 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入. 在AOP中,Spring通过生成代理类,来完成切面的织入. Spring生成代理类有2种方式. 如果目标对象实现的是一个接口,Sprin

  • java应用开发之Mybatis通过Mapper代理自定义接口的实现

    如何实现?主要分为以下两步骤 1.通过 Mapper 代理实现⾃定义接口 2.编写与方法相对应的 Mapper.xml 1.自定义接口AccountRepository package repository; import entity.Account; import java.util.List; public interface AccountRepository { public int save(Account account); public int update(Account ac

  • MyBatis 源码分析 之SqlSession接口和Executor类

    mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用.可以说SqlSession接口实例是开发过程中打交道最多的一个类.即是DefaultSqlSession类.如果笔者记得没有错的话,早期是没有什么getMapper方法的.增删改查各志有对应的方法进行操作.虽然现在改进了很多,但是也保留了很多.我们依旧可以看到类似于selectList这样子的方法.源码的例子里面就可以找到.如下 SqlSession session = sqlMapper.openSession(T

  • C#动态webservice调用接口

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Hishop.Plugins { /// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类

  • 动态webservice调用接口并读取解析返回结果

    这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下. using System; using System.Collections; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Hishop.Plugins { /// <summary>

  • Java集合之Set接口及其实现类精解

    目录 Set接口概述 HashSet实现类 1.HashSet 具有以下特点: 2.HashSet 集合判断两个元素相等的标准 3.向HashSet中添加元素的过程 LinkedHashSet实现类 TreeSet实现类 Set接口概述 1.Set接口是Collection的子接口,set接口没有定义额外的方法,使用的都是Collection接口中的方法. 2.Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败. 3.Set:存储无序的.不可重复的数

  • Java JDK内置常用接口和深浅拷贝

    目录 前言 一.comparable接口 二.Cloneable接口 三.深浅拷贝 1.浅拷贝 2.深拷贝 前言 在Java中,我们使用接口优先原则,当一个场景可以使用抽象类也可以使用接口定义时,优先考虑使用接口,因为接口更灵活,使用抽象类必须满足is a 的继承树关系,而且是单继承,接口相比于抽象类更加的灵活,本篇我们就一起看看JDK中的常用内置接口. 一.comparable接口 java.lang.Comperable: 当一个类实现了Comperable接口,就表示该类具备了可比较的能力

  • java集合collection接口与子接口及实现类

    目录 概要 1 Collection接口的实现子类特性 2 通过实现子类ArrayList体现Collection接口方法 2.1 代码演示示例 3 集合的遍历:①使用Iterator(迭代器)②增强for循环遍历 3.1 代码示例 4 List相关解读 5 Set接口分析 Map接口及实现子类 结语 概要 集合概念:像数组一样是java的一个容器:和数组不同的是数组只能存同类型的数据,且长度定义之后就不可变,集合不仅,可以存多种类型的数据,而且还提供了增.删.改.查的方法: 集合分类:可以分为

随机推荐