从动态代理到AOP到spring事务

一、动态代理

1.代理模式

代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(方法增强),不修改目标对象,就可以完成功能的改造扩展

参考资料:Spring【AOP模块】就这么简单Spring AOP模块详解https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483954&idx=1&sn=b34e385ed716edf6f58998ec329f9867&chksm=ebd74333dca0ca257a77c02ab458300ef982adff3cf37eb6d8d2f985f11df5cc07ef17f659d4&scene=21#%23wechat_redirect

2.静态代理

由程序员创建代理类,并将目标对象装配到代理类中,自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了

3.动态代理

动态代理是在用JDK API,利用反射动态的在内存中创建代理对象,不需要实现接口,不会产生代理类过多的问题。

参考资料:Proxy.newProxyInstance源码探究_码猿手-CSDN博客_newproxyinstance源码

Proxy.newProxyInstance()的源码剖析:

①克隆拿到接口: final Class<?>[] intfs = interfaces.clone();
②得到代理类(核心):Class<?> cl = getProxyClass0(loader, intfs)

Proxy.ProxyClassFactory#apply()中的静态方法ProxyGenerator.generateProxyClass()通过产生指定的代理类信息,是二进制信息,可以使用IO流输出代理类的Java文件:

(1).收集代理类要实现的接口中的所有方法,包装成ProxyMethod对象,并通过Map保存接口名到ProxyMethod对象的映射;

(2).添加参数类型为InvocationHandler的代理类构造器方法;

(3).遍历Map,生成每个代理方法的Method类,作为静态字段添加到代理类中;

(4).遍历Map,完成每个代理方法的实现,添加到代理类中;

(5).添加静态初始化方法,将每个代理方法的引用赋值给对应的静态字段;

参考资料:JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析_chuxiong5717的博客-CSDN博客

③创建新的代理对象:return cons.newInstance(new Object[]{h})

4.cglib帮助没有实现接口的类实现动态代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值