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在分离关注点和添加新功能方面的优势。
51 0
|
6月前
|
Java Spring
切面编程的锋芒:Spring切入点的玩法与技巧
切面编程的锋芒:Spring切入点的玩法与技巧
42 0
切面编程的锋芒:Spring切入点的玩法与技巧
面试被问了几百遍的 IoC 和 AOP,还在傻傻搞不清楚?
首先声明:IoC & AOP 不是 Spring 提出来的,它们在 Spring 之前其实已经存在了,只不过当时更加偏向于理论。Spring 在技术层次将这两个思想进行了很好的实现。
|
Java 程序员 Maven
【Spring框架】——与君初相识
Spring是一个轻量级开源框架,由一个叫Rod Johnson的程序员在 2002 年提出并创建。
377 1
【Spring框架】——与君初相识
|
XML Java 数据库
|
XML Java 数据库
【AOP】如期而至,你准备好了吗!
本文主要介绍 Spring 中 AOP的XML配置开发
101 0
|
Java 机器人 Spring
浅入浅出代理模式与Spring事务管理 上
浅入浅出代理模式与Spring事务管理
177 0
浅入浅出代理模式与Spring事务管理 上
|
XML Java 程序员
一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
327 0
一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
|
XML Java API
工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!
工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!
工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!
|
Java API Spring
Spring的艺术(五):通俗易懂的AOP切面详解
在前面的学习中,我们已经把Spring的一个核心IOC学习完毕,下面开始学习Spring的另外一个核心--Spring AOP。AOP翻译为面向切面编程,刚开始接触的小伙伴肯定不明白什么是面向切面。简单来讲,面向切面就是对业务逻辑的各个部分进行隔离。 最常见的就是日志与业务逻辑分离,我们就可以通过AOP在业务逻辑执行前写日志,也可以在业务逻辑执行后写日志,而不会动已经写好的业务逻辑代码。