注解、动态代理和AOP

今天的工作中,重构之前的项目,有切面注解,但是运行和调试时发现,居然没有生效,切面内的方法没有执行,一时间完全不明所以。经过前人指点,原来这是AOP基于动态代理,在代码执行过程中存在的现象。

注解

注解是利用了反射机制,能够通过注解处理器,获取到程序元素(包、类、成员等)的所有注解,在编译器生成类文件时,标注可以被嵌入到字节码中。当通过反射去获取一个注解类实例的时候,其实 JDK 是通过动态代理机制生成一个实现我们注解(接口)的代理类。

动态代理

代理这个词听起来很职业化,但其实没有那么复杂。
两种动态代理:
JDK代理,是通过执行Proxy类的newProxyInstance方法来创建代理对象;
CGLib,是通过继承来实现,子类对象就是父类对象的代理。
简单的理解,就是生成了一个新的对象,这个对象中包含了原来类的对象特征,不论是通过JDK代理的新建对象,还是通过CGLib的继承。而新的对象当然还包括我们需要扩展的一些功能、属性。

AOP

AOP是基于动态代理实现的。根据切面,生成动态代理对象。

实际遇到的问题

之前没有深入的理解注解、动态代理和AOP,当一个类中,一个方法调用本类的另外一个方法时(比如方法A调用方法B),就不会意识到,两个方法的主体对象会不同的情况。而从实验的事实来看,通过接口、service等直接调用的方法,会是动态代理对象的方法(方法A),能够正常拥有切面注解从而代理生成的相关功能、方法。而在这个方法内,再次调用本类的方法时(方法B),spring会直接获取容器中的原对象的方法,自然就不会有切面相关功能,也不会走到切面中来。
其实上述过程中,还隐藏了一个事实,在多次、多重注解、代理的过程中,获取到的代理对象会是最终的那个代理对象。
同时,为什么spring不全都使用代理对象,而是代理对象与原对象交叉混合,还不太理解。但以后,要从认识之初就意识到,运行环境中,存在原对象与代理对象之分,如果期待的代码区域没有被执行,很可能是将二者搞错了。
在这里插入图片描述
那么,有没有一个工具,最好是可视化工具,来查看运行时对象的存在、执行情况?spring的debug日志中是否有所体现?这些都有待后续继续学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值