栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

AOP 笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AOP 笔记

JDK 静态代理

一般地,实现 JDK 静态代理需要三个类:服务接口、代理类、被代理类。代理类和被代理类都需要实现服务接口。

比如,Tomcat 中 Request 和 RequestFacade 应该也属于代理类与被代理类的关系。它们均实现了 HttpServletRequest 接口,并且 RequestFacade 是 Request 的一个属性。可以认为 Request 的方法会被委托给 RequestFacade 完成。

JDK 动态代理

动态代理最终会生成一个代理类,但是真正执行方法的是 InvactionHandler

java.lang.reflect.Proxy#newProxyInstance

其中,调用方法 getProxyClass0 寻找或者生成 Proxy Class。

Proxy 拥有一个属性 proxyClassCache,寻找或生成 Proxy Class 会从该属性中得到:

private static final WeakCache[], Class>
    proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());
WeakCache

WeakCache 是一个有三个泛型的类 WeakCache,其中, 表示 key 的类型,

表示参数类型, 值类型

WeakCache 是一个 ( k e y , s u b − k e y ) − > v a l u e (key, sub-key) -> value (key,sub−key)−>value 的映射缓存。底层结构:

private final ConcurrentMap>> map = new ConcurrentHashMap<>();

key 和 value 是弱引用,sub-key 是强引用。因为 key 的实现类是 CacheKey,value 的实现类是 Cachevalue,它们都实现了 WeakReference。

key 和 parameter 传递给 get() 方法。sub-key 通过使用 subKeyFactory 从 key 和 parameter 中计算出来。value 通过 valueFactory 从 key 和 parameter 中计算。
key 可以为空,但是 sub-key 和 value 不可以为空。

private final ReferenceQueue refQueue = new ReferenceQueue<>();
private final ConcurrentMap>> map = new ConcurrentHashMap<>();
private final BiFunction subKeyFactory;
private final BiFunction valueFactory;

当调用 get(), containsValue(), size() 方法的时候,entry 会从缓存中删除(惰性)。

V get(K key, P parameter) 方法逻辑:

  1. 删除缓存
  2. 通过 key 计算出 cacheKey
  3. 从 map 中获得 ConcurrentMap>,如果为 null,则 put,最终得到 valuesMap
  4. 通过 subKeyFactory 计算得到一个 subKey,从 valuesMap 获得 supplier
  5. 如果 supplier 不为 null,则 get() 并返回该值;否则,创建 factory 并 put 到 valuesMap 中,成功获得 supplier.
KeyFactory

Proxy 提供的内部类 KeyFactory,根据 interfaces 的数量,返回不同的 Key 实例:

  • 1 个 interface:Key1
  • 2 个 interface:Key2
  • 0 个 interface:key0(本质上是一个 Object)
  • 其他:KeyX

该工厂类用于生成 WeakCache 的 sub-key。

 

ProxyClassFactory

Proxy 提供的内部类 ProxyClassFactory。底层调用 native 方法 defineClass0 获得 Class。

该工厂类用于生成 WeakCache 的 value。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356948.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号