【mybatis框架学习】二、动态代理初识
Mapper接口只是接口,总要实例化一个实例拿来用的,通过动态代理来干这事情属于基本操作。
日常只是开发业务功能的我确实从来没用过这东西,这次学习mybatis打算好好了解下。
随便百度多看几篇动态代理的文章就能有一定了解了:
loader – the class loader to define the proxy class
interfaces – the list of interfaces for the proxy class to implement
h – the invocation handler to dispatch method invocations t
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
创建接口动态代理实例的构造方法有3个入参:
loader-类加载器,这个我还没概念,先知道怎么用就好
interfaces-就是要代理的接口类,类型设计为数组表示,可以同时代理一组多个接口类,此时实例化的对象, 可以调用数组中的全部接口类中定义的全部方法(可能需要实际验证下列表中多个接口类的场景)
h-是接口InvocationHandler的一个实例,需要我们自行定义一个实现类,代理实例在调用指定方法时,内部实际都会调用h中唯一的方法invoke(这样方法调用时实际需要做什么,都可以在invoke方法中自行编排)
我们需要重点理解invoke方法,此处需要再次百度多看几篇文章进行学习
Object invoke(Object proxy, Method method, Object[] args)
如果是一个初学者,或者说没有深入了解过java语法,是会对框架源码中的很多设计理念没有一个清晰的概念及认知。
这并不可怕,也属于人之常情,但人与人之间的差距在于,你能否清晰认识到自己的不足,以及是否拥有探索未知的好奇心。
我们知道调用方法,可能是需要入参的,因此对于invoke方法的第三个入参大家都很容易理解到就是mapper方法调用时传入的入参信息
那Method类型的第二个入参呢?这就又是一个我没有了解过的东西。(此时又需要百度搜之,java反射Method)
点开类定义可以大致猜测到,它就是描述了一个“方法”的所有信息:入参是什么,返回值是什么,被添加了什么注解,方法名称叫什么
有了它,我们在invoke方法中就可以更方便的对当前方法的调用逻辑进行编排
第一个参数的类型是Object,从命名可以自然联系到动态代理帮我们创建的代理实例,百度后也了解到正式这样(百度搜索,java InvocationHandler invoke方法的第一个参数有什么用)
其实英文及格的话,直接看源码中的参数注释就好了,谁让我是个学渣呢
它也是为了让我们的逻辑编排可以更加灵活
那么现在可知,动态代理创建的对象有了,当前被实际调用的方法描述信息有了,入参信息也有了,我们已经进入了被代理方法的后花园,可以开始进入上帝模式了。
待续