AOP的点点滴滴

简介: 首先AOP是一种思想,我们不能将它局限于某种语言

Aop

1.首先AOP是一种思想,我们不能将它局限于某种语言。

      比方说我们在大脑中构造一个桌子,我们可以用木头做桌子,也可以用石头做桌子,也可以用塑料做桌子。而AOP就像大脑中构造的桌子,木头、石头、塑料就相当于是实现AOP的各种编程语言。

2、AOP是软件开发进步的产物,是对面向对象开发模式的补足。可以从以下几点分析

(1)为了提高开发效率:汇编语言---->高级语言

      我们都知道起初的程序员都是一个一个的扣汇编指令,这样的开发效率可想而知。先辈们为了提高开发效率,各种高级编程语言如雨后春笋般冒了出来,这大大提高了软件的开发效率。

(2)为了便于维护和扩展:过程化编程---->面向对象编程(OOP及Object-Oriented Software Development)

      开发语言虽然变高级了,但是开发思想还是比较落后的,怎么说呢?我们的编程方式是"顺序"编写下去的,这样的代码是不便于维护和扩展的,而且特别冗余。这是就有人提出了OOP思想。大家一看这思想还不错,然后开发就开始采用这种思想了。

(3)对OOP开发模式的补足:面向对象编程(OOP)+面向方面编程(AOP及Aspect-Oriented Programming)

      高级语言+OOP思想就无敌了吗?不然。开发中为了调试,或进入生产环境后为了对系统进行监控,我们需要为这些业务需求的实现对象添加日志记录功能。或者进行安全检测。比方说就我就像在所以函数的函数体的第一句输出一下参数的情况,这是不是很麻烦,一句句的system.out.println(“参数1,参数2.。。。”);?如果我想在这个输出中在加点其它东西呢,是不是特别不易于维护。那么为了解决这些问题AOP思想就出来了。

AOP面向切面理解

      大家一定见过传输带吧,我们编写的业务需求代码就好比传输带上的物品。而我们现在有一个系统需求,就是需要将传输带上红色的物品旋转180°,那么最好的办法是不是我们站在传输带旁边看着,一发现有红色的物品我们手动将物品旋转180°然后放好。

业务需求:系统的功能,用户需要的功能,这叫业务需求。

系统需求:就是程序员想要干的事,和这个系统本来的功能没太大的关系。

2345_image_file_copy_433.jpg

      是不是可以看出传输带上的物品与我们站在传输带旁工作是不是两个完全不同的维度,这就是为什么说AOP是面向切面编程,它是横切到代码中的。

AOP的实现语言

实现AOP的语言称为AOL(Aspect-Oriented Language)。

AOL可以与系统的实现语言相同,也可以是其它语言。

如对Java语言进行扩展而形成的AOL语言AspectJ,当然还有

AspectC;

AspectC++;

AspectNet;

Aspect(Lisp);

AspectPHP;

      AOL实现的各种AOP概念实体,最终都需要某种方式集成到系统实现语言所实现的OOP实体组件中。所以,系统实现语言通常称为系统中使用的AOL的”寄生语言“,而将AOP组件集成到OOP组件的过程,在AOP中称之为织入(Weave)过程。

AOP的织入形式

静态AOP

第一代AOP

编译期间进行织入

代表AspectJ

特点:相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。比如,Aspect会使用ajc编译器将各个Aspect以Java字节码的形式编译到系统的各个模块中,以达到融合Aspect和Class的目的。

优点:Aspect直接以Java字节码的形式编译到Java类中,Java虚拟机可以像通常一样加载Java类运行(因为编译完成的Aspect是完全符合Java类规范的),不会对整个系统的运行造成任何的性能损失。

缺点:灵活性不够。如果横切关注点需要改变织入到系统的位置,就需要重新修改Aspect定义文件,然后使用编译器重新编译Aspect并重新织入到系统中。

动态AOP

第二代AOP

运行期间进行动态织入

特点:AOP的织入过程在系统运行开始后进行,而且织入信息与系统模块分开,可以在调整织入点以及织入逻辑单元的同时,不必变更系统其它模块,甚至在系统运行的时候,可以动态更改织入逻辑。

缺点:相应的性能损耗(损耗小,可以接收)

AOP相关的相关术语

这样理解Aspect

Aspect之对于AOP,就相当于Class之对于OOP。

我们说过AOP是对OOP方法的一种补足,当我们把以Class形式模块化的业务需求和以Aspect形式模块化的系统需求拼装到一起的时候,整个系统就算完成了。

下面写个业务需求,便于举例子

业务需求:输出“博主真帅”

/**
 * @author 齐天大圣
 * @Version 1.0
 */
public class TestDemo {
    public void f01(){
        System.out.println("博主真帅");
    }
}

1、横切关注点:系统需求(程序员想看看的东西,与系统本来的功能无关)。

            比如说我像在调用f01方法之前输出一段话“博主真的真的好帅”,那么这个行为就是横切关注点

2、织入:将AOP组件集成到OOP组件的过程。

3、连接点(Joinpoint):在系统运行前,AOP的功能模块都需要织入到OOP的功能模块中。所以,要进行这种织入过程,我们需要知道在系统的哪些执行点上进行织入操作,这些将要在其之上进行织入操作的系统执行点就称之为Joinpoint。

            在这个方法前输出“博主真的真的好帅”,那这个“前”的这个地方的这个点就是Joinpoint。

2345_image_file_copy_434.jpg

4、切入点(Pointcut):Joinpoint的表述方式。

            表述出上面的那个点的位置,想想经纬度。

5、通知(Advice):是单一横切关注点的载体,它代表将会织入到Joinpoint的横切逻辑。如果将Aspect比作OOP的Class,那么Advice就相当于Class中的Method。(将你需要干的系统业务封装起来)

6、切面(Aspect):是对系统中的横切关注点逻辑进行模块化封装的AOP概念实体。通常情况下,Aspect可以包含多个Pointcut以及相关Advice定义。

相关文章
|
3月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
59 0
|
6月前
|
Java Spring
切面编程的锋芒:Spring切入点的玩法与技巧
切面编程的锋芒:Spring切入点的玩法与技巧
46 0
切面编程的锋芒:Spring切入点的玩法与技巧
面试被问了几百遍的 IoC 和 AOP,还在傻傻搞不清楚?
首先声明:IoC & AOP 不是 Spring 提出来的,它们在 Spring 之前其实已经存在了,只不过当时更加偏向于理论。Spring 在技术层次将这两个思想进行了很好的实现。
|
Java 程序员 Maven
【Spring框架】——与君初相识
Spring是一个轻量级开源框架,由一个叫Rod Johnson的程序员在 2002 年提出并创建。
381 1
【Spring框架】——与君初相识
|
XML Java 数据库
|
XML Java 数据库
【AOP】如期而至,你准备好了吗!
本文主要介绍 Spring 中 AOP的XML配置开发
104 0
|
XML Java 程序员
一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
333 0
一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
|
XML Java API
工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!
工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!
工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!
|
设计模式 缓存 NoSQL
专治不会看源码的毛病--spring源码解析AOP篇
总结一下要形成的习惯:   1>有空时隔一段时间要做几道算法题,C语言和JAVA都可以,主要是训练思维。 2>定期阅读spring的源码。因为spring是框架,重设计,能够培养大局观。   3>阅读底层的书籍,如linux方面,虚拟机方面,这是内功。越高级的语言只是招式。   4>不要忘记做了一半的东西,如搜索引擎方面,redis方面,可以过一段时间再做,因为到时候自己的境界有提升,深入程度也会有所增加。      下面是今天的正题。我也很菜,看源码也很费力,所以都会从最容易的入手。先了解其原理,再去看源码。看源码看熟了,以后再遇到问题,就可以通过源码去了解原理了。
专治不会看源码的毛病--spring源码解析AOP篇
|
Java Spring
听说你还不会AOP?
大家好,我是指北君。 AOP(Aspect-Oriented Programming)经常会出现在面试过程中,AOP到底有没有用,要怎么使用呢。本篇来一起拨开迷雾!
听说你还不会AOP?