前言:编故事理解动态代理
很小的时候,小明(调用者)要去找小红同学(真实对象),但小明不能直接找到小红同学,要通过小红的家人(代理对象)才能联系到她。
怎么理解这个动态呢?
有一天,小明要去见小红,小明来到小红家门口,出来开门的可能是小红的爸爸或妈妈,甚至可能碰到小红的爷爷奶奶(这个代理对象是动态的)。 比如,出来给小明开门的是小红的爸爸,小红爸爸要首先确认小明的身份,才能同意小明上楼找小红。那么确认小明身份这个过程相当于AOP中的前置通知。确认过身份,同意小明上楼找小红了,小明见到了小红,问到了自己想要问的问题。之后,小红的妈妈要留小明在家一起吃午饭,这相当于后置通知。
动态代理,由两个关键字组成,一是动态,二是代理。先来说说代理,代理涉及到代理模式,代理的本质就是代理模式。
1. 代理模式
代理模式由三要素,俩动作组成。
三要素:
- 接口(定义了服务)
- 真实对象(继承接口,提供真正的服务。不能直接访问真实对象,只能通过代理对象去访问)
- 代理对象(包含真实对象,从而操作真实对象)。
俩动作:
- 真实对象和代理对象要实现共同的接口。
- 代理对象包含真实对象。
代理对象中有静态的,也有动态的。
2.动态代理
动态代理,代理的本质就是代理模式,其中的动态我认为指的是不确定生成哪个代理对象。
在java中,动态代理类包含InvocationHandler(增强器)和Proxy(调度器)
理解InvocationHandler:
为什么要增加器呢,该增强器是代理对象对真实对象的增强。比如对真实对象某些方法的前后分别做某些事件以增强真实对象的内容。
举个例子,乘客进入地铁,但进入地铁站前要检查体温,进入地铁站之后要过安检,最后才能进入地铁。
理解Proxy:
当你访问的时候,总会调度一个代理对象服务调用者,调度器是专门调度代理对象服务调用者的。
在java中,就是通过实现InvocationHandler,重写覆盖invoke方法进行增强业务,该方法中的method.invoke(真实对象,方法参数)就是真实对象的方法调用本身,
而代理对象的生成是由Proxy.newProxyInstance()方法。
3. 理解来源
代理模式理解图
java的动态代理包含Proxy和InvocationHandler
学习来源及链接:
https://www.bilibili.com/video/BV1Dt41187wj?from=search&seid=6290600221112243542