Spring aop 动态代理的实现 一

2017-11-30  本文已影响0人  FineDay丶

最近把Spring aop 底层代码自己捣鼓了下,发现挺有意思的。其实就是动态代理的一种实现,有java 标准实现 也就是JDK 中的Proxy 那种实现,还有一种 CGLIB 实现的(下章重点讲解)。本章先讲一下 java的动态代理的源码分析,网上很多 不过我加上些自己的理解。

下面看图 

其实重点就是这句话!    调用newProxyInstance 这个方法 返回个代理类。  我们断点进入。

重点1.    getProxyClass0    JDK 1.6版本好像还是  getProxyClass 没有这个0     这个方法呢 看注解的意思是  "查找或生成指定的代理类 "我们

点进去看看。   

方法很简单~ 而且从中可以知道个小彩蛋   java一个类  最多可以实现65535个借口  重点应该是get方法了! 我们继续往下看 proxyClassCache (WeakCache) 的get方法!   也就是获取一个代理类 !


代码比较长 别担心!  看注解大概意思就是从缓存里面找    返回一个 “value”  我们先不管他怎么缓存的 直奔主题! 反正这个方法就一个return 地方 而且"value" 对象  是在supplier.get()方法确定的! OK找到了 就是它  继续 进去!

在   value=   Objects.requireNonNull(valueFactory.apply(key,parameter));  在这确定的 value  也就是   apply方法放回个对象 然后判断是不是Null是null的话抛异常  。 点进去apply  

这个方法很长 我挑出重点来说 其他的省略 有兴趣的自己点点。

让JVM装载这个类

初始化   代理类的包名  (确定这个包可以访问到所以需要代理的类实现的借口)这里设计很巧妙    默认是 com.sum.Proxy 这个 包 但是考虑到 比如一个类  实现了cn.a 包下的 公开的 public A借口,同时也实现了 cn.b 包下 非公开的! B借口。这时候大家想一下? 如果是 com.sum.Proxy 包 能访问到 B包下的 非公开借口吗? 不能! 所以这个场景 代理类的包名就是  cn.b !

生成代理类! 先生成 代理类文件  然后通过defineClass0生成类! 大工搞成 虽然源码里看不到 但是可以通过反编译 看到这个类的结构!

生成的这个类 集成了proxy 并且实现了你需要代理的对象所实现的接口 ! 这个是JAVA通过“模板” 的方式生成的 所以 你需要代理的类 必须是一个实现接口的类!    大家可以自己打断点跟着思路自己理解

上一篇 下一篇

猜你喜欢

热点阅读