Spring两大核心之一AOP的基本原理

AOP:面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。主要功能有日志记录,性能统计,安全控制,事务处理,异常处理等等。主要意图就是把以上功能从业务逻辑代码中分离出来,进而改变这些行为的时候不影响业务逻辑的代码。说白了,就是扩展功能不修改源代码实现。

在说具体原理之前,我们先看看原来我们是怎么实现功能扩展的。

《Spring两大核心之一AOP的基本原理》

后来出现了纵向继承机制

《Spring两大核心之一AOP的基本原理》

这两种方法都不能完成扩展功能而不修改源代码实现。下面我们就来说说AOP,底层使用动态代理的方式实现,动态代理有两种方式,一种是基于接口的,叫JDK动态代理,还有一种不基于接口的,叫cglib动态代理。

JDK动态代理,就是创建接口实现类的代理对象,和接口实现类平级,实现和接口实现类相同的功能

先写下面的接口类。

《Spring两大核心之一AOP的基本原理》

怎么来理解呢。

打个比方,我正在家里打LOL,老妈在厨房做晚饭,我这边激战正酣,马上就要打大龙了,这时老妈一声吼:”儿子,酱油没了,快去超市给我买点回来,不然红烧肉烧不起来啦!”一边是队友,一边是老妈的狮子吼,大伙说我该怎么选择呢?这能走的开不?当然是不能,那怎么办呢,于是我跟旁边的老婆说,你去帮妈买酱油吧,顺便帮我带瓶可乐回来。嘿嘿~于是我老婆替我去超市了。这边,老妈就相当于接口Dao类,她有个需求就是去打酱油,相当于add(),我呢就相当于DaoImpl,我能实现她要我去打酱油的目的。我老婆呢就是我的代理对象,跟我是平级的。她不仅能去打酱油,还能买可乐。这样功能不仅实现了,也扩展了。

代理对象就是用动态代理的方式实现的,也就是程序在运行时,运用反射机制动态创建而成的,反射(原理参考java类反射机制创建对象嘛当然也不需要new一个新的对象出来了。你想也是啊,我妈总不能这会再给我生个弟弟妹妹出来吧,那也来不及啊。

cglib动态代理就是创建类的子类的代理对象,在子类里调用父类的方法完成增强。

还是以上面的例子来说,这时场景发生点变化,我妈还是Dao,不过不是接口类了,就是一个普通的类,这时还我老婆做我的代理去打酱油吗?当然不行,这会她正在帮妈洗菜摘菜呢,也走不开,那怎么办呢?我要不去的话,老妈和老婆肯定要骂的我狗血淋头。这时刚好儿子走了过来,让我给他买新出的变形金刚玩具,于是我小声对他说:”你去帮奶奶买瓶酱油,顺便买点可乐,买回来后把酱油给我,不过不能告诉你妈说是我让你去的,这样我就给你买玩具,怎么样?”于是儿子高兴的去超市了,买回了酱油和可乐给我。我就拿着酱油去找我妈了。这里我是我妈的子类,儿子就是我的代理对象。最后我拿着酱油去找我妈就是完成了她的需求,也完成了增强。

    原文作者:AOP
    原文地址: https://blog.csdn.net/wei55255555/article/details/79880875
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞