乐趣区

关于java:都知道面向对象了那么面向切面呢通俗易懂带你走进面向切面编程

什么是 AOP

文章会同时公布在同名公众号《码可思》,一个适宜学生党的公众号!
带你通俗易懂走进编程世界!

1、概念

在软件业,AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译形式和运行期间动静代理实现程序性能的对立保护的一种技术。AOP 是 OOP 的连续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 能够对业务逻辑的各个局部进行隔离,从而使得业务逻辑各局部之间的耦合度升高,进步程序的可重用性,同时进步了开发的效率。

说一下 OOP

有一天面试官问你什么是 OOP?

而后你可能会一脸懵逼的说 OOP?what?这是什么玩意!其实它就是你始终学的面向对象编程(Object Oriented Programming),

那么咱们要怎么了解面向对象编程呢?

咱们都晓得面向对象编程之前还有一个面向过程编程。咱们学习编程的根底 C 语言就是面向过程的编程。要怎么具体了解这两者的区别呢?

举个简略的例子。当你要吃一份蛋炒饭的时候,你该怎么办,上面给你两个抉择!

1、本人买食材,而后煮饭,炒蛋,加上所有你想下的配料而后最初炒完出锅。

2、你去某某某大酒店,坐下大喊:“服务员!来一份蛋炒饭”(应该不会被打死吧,就点一份蛋炒饭)

看进去区别了嘛!其实说到这里应该都有感觉了,1 就是面向过程的,2 就是面向对象的!

那么这两种编程形式到底有什么区别呢?

第二种的话,你不须要晓得蛋炒饭具体是怎么做的,你只须要点餐而后最初就能吃到。如果你点完忽然不想吃了(在服务员没炒之前哈,不然老板可能认为你搞事件,会把你轰出去!),想换成牛肉炒饭,此时你只须要跟老板说一声就能换了。而后如果你自身是第一种的话,你刚买的食材就废了。因为你只有鸡蛋,没有牛肉,可能所有就得从新来过!这就两者最显著的区别

面向过程是一步一步剖析,一步一步实现的,

面向对象是模型化的,咱们只须要形象出一个类就行,封装起来,而后要用的时候间接调用。至于具体外面怎么实现的(就是蛋炒饭怎么抄的齐全不关咱们的事件,咱们只须要吃就行了!)

所以当初来总结一下两者的优缺点:

面向对象:

  • 长处:易保护、易复用、易扩大
  • 毛病:性能比拟差,因为类调用时须要实例化,开销比拟大,比拟耗费资源

面向过程:

  • 长处:性能好
  • 毛病:不易保护、不易复用、不易扩大

而后上面回到咱们明天的主题,AOP面向切面编程!是在咱们的 OOP的根底上提出来的!

2、切面要怎么了解?

AOP 是面向切面编程,那么这个切面到底是指什么呢?

其实很容易了解,一个残缺的西瓜,咱们拿一把刀沿着两头切下去,此时咱们就失去了两个切面。

在编程中,对象与对象之间,办法与办法之间,模块与模块之间都是一个个切面

3、那么面向切面有什么用呢?

先来说一下咱们很相熟的一个例子:

例如:当初有一个 Dog 类 和 Cat 类,它们都有独特的办法,它们都能跑 run(),都能吃 eat()。

在咱们 OOP中,此时就会写一个 Animal 类,这个类有了 Dog 类和 Cat 类中独特的办法。run() 和 eat()

这样的话咱们就只须要在实现 Dog 和 Cat 的时候,去继承 Animal 类即可!这样的确缩小了咱们反复代码的书写。

然而当初问题来了!

如果此时在咱们的父类中多个办法的雷同地位中,呈现了很多反复的代码!此时应该怎么办?还有的是,Java 只提供单继承,不能继承其它父类。

OOP 是一个纵向的的体系,从上到下的。

所以此时咱们的配角来了!AOP 面向切面的。

把这一处处须要用到这些独特办法中央都看成一个切面,而后把独特办法独立进去。再横切进去。

可能有人会想说,咱们父类中,不就是把子类中独特的办法提出来了嘛?那么这不是一样的吗?

然而咱们还须要想到的一点就是,父类中也会有本人的一些动作(本人的业务代码),此时和这些子类的独特办法混淆在了一起,这个时候就会显色非常的臃肿!变得不易保护!

AOP 就是用来解决这些问题的!

AOP 将咱们这些所谓的须要横切的代码独自提取进去,和原来的业务代码进行了拆散。

下面这张图就可能很显著的看进去,这两者的不同。在这个过程中,须要保障的是,原来的业务代码不能被毁坏掉!

4、AOP 解决了什么问题呢?

通过下面的剖析能够发现,AOP 次要用来解决:在不扭转原有业务逻辑的状况下,加强横切逻辑代码,基本上解耦合,防止横切逻辑代码反复。

5、AOP 中的相干概念

学习了 Spring 的同学可能就晓得,在 Spring 中,有两个很重要的货色,一个是 IOC,另外一个就是 AOP 了,IOC在我的上一篇文章就曾经带着大家了解了一遍了,没看的同学们能够查看历史音讯。在 Spring 中,AOP有很多业余的概念,以下为大家列了进去:

  • Aspect(切面):Aspect 申明相似于 Java 中的类申明,在 Aspect 中会蕴含着一些 Pointcut 以及相应的 Advice。
  • Joint point(连接点):示意在程序中明确定义的点,典型的包含办法调用,对类成员的拜访以及异样处理程序块的执行等等,它本身还能够嵌套其它 joint point。
  • Pointcut(切点):示意一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等形式集中起来,它定义了相应的 Advice 将要产生的中央。
  • Advice(加强):Advice 定义了在 Pointcut 外面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • Target(指标对象):织入 Advice 的指标对象.。
  • Weaving(织入):将 Aspect 和其余对象连接起来, 并创立 Advice的 object 的过程

而后最初举一个例子,例子是在 CSDN 下面看到的,十分的形象!文字有点多,然而还是心愿大家把它看完,看完后真的受益匪浅

让咱们来假如一下, 从前有一个叫爪哇的小县城, 在一个月黑风高的早晨, 这个县城中产生了命案. 作案的凶手非常刁滑, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王恰好在这时候无心中发现了凶手行凶的过程, 然而因为天色已晚, 加上凶手蒙着面, 老王并没有看清凶手的面目, 只晓得凶手是个男性, 身高约七尺五寸. 爪哇县的县令依据老王的形容, 对守门的士兵下命令说: 但凡发现有身高七尺五寸的男性, 都要抓过去审讯. 士兵当然不敢违反县令的命令, 只好把进出城的所有符合条件的人都抓了起来.

小故事和 AOP 到底有什么对应关系?

首先咱们晓得, 在 Spring AOP 中 Joint point 指代的是所有办法的执行点, 而 point cut 是一个形容信息, 它润饰的是 Joint point, 通过 point cut, 咱们就能够确定哪些 Joint point 能够被织入 Advice. 对应到咱们在下面举的例子, 咱们能够做一个简略的类比, Joint point 就相当于 爪哇的小县城里的百姓 ,pointcut 就相当于 老王所做的指控, 即凶手是个男性, 身高约七尺五寸, Advice 则是施加在合乎老王所形容的嫌疑人的动作: 抓过去审讯 .
为什么能够这样类比呢?

  • Joint point:爪哇的小县城里的百姓: 因为依据定义, Joint point 是所有可能被织入 Advice 的候选的点, 在 Spring AOP 中, 则能够认为所有办法执行点都是 Joint point. 而在咱们下面的例子中, 命案产生在小县城中, 按理说在此县城中的所有人都有可能是嫌疑人.
  • Pointcut:男性, 身高约七尺五寸: 咱们晓得, 所有的办法(joint point) 都能够织入 Advice, 然而咱们并不心愿在所有办法上都织入 Advice, 而 Pointcut 的作用就是提供一组规定来匹配 joinpoint, 给满足规定的 joinpoint 增加 Advice. 同理, 对于县令来说, 他再昏庸, 也晓得不能把县城中的所有百姓都抓起来审讯, 而是依据凶手是个男性, 身高约七尺五寸, 把符合条件的人抓起来. 在这里 凶手是个男性, 身高约七尺五寸 就是一个润饰谓语, 它限定了凶手的范畴, 满足此润饰规定的百姓都是嫌疑人, 都须要抓起来审讯.
  • Advice:抓过去审讯, Advice 是一个动作, 即一段 Java 代码, 这段 Java 代码是作用于 point cut 所限定的那些 Joint point 上的. 同理, 比照到咱们的例子中, 抓过去审讯 这个动作就是对作用于那些满足 男性, 身高约七尺五寸 的爪哇的小县城里的百姓.
  • Aspect::Aspect 是 point cut 与 Advice 的组合, 因而在这里咱们就能够类比:“依据老王的线索, 但凡发现有身高七尺五寸的男性, 都要抓过去审讯”这一整个动作能够被认为是一个 Aspect.

所以这个小故事其实很好的向咱们展现了彼此之间的关系!

可能看到这里的同学,我感觉毅力是相当的好的!因为这篇文章根本全身理论性的货色,阿蓝在书写和布局的过程也是有想到写进去会非常的干燥!然而没方法,咱们看完了可能把握到它的精华,这就很足够了!

最初补充一下 AOP 的利用场景

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging 调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence 长久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

END

最初心愿这篇文章可能帮忙到你,如果文章中存在什么谬误,请大家加以斧正!

退出移动版