作为一个Javaer,OOP(面向对象编程)是我们最先接触到并实践的概念,而AOP可能只是听过她的传说,并没有打过照面。今天我们就来一起揭开她神秘的面纱。

一、什么是AOP?

AOP(Aspect Oriented Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子。在不改变原有的逻辑的基础上,增加一些额外的功能。代理也是这个功能,读写分离也能用aop来做。
OOP面向对象编程,引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系。对于其他类型的代码,如安全性校验、异常处理、参数校验、日志、事务等功能也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的操作和维护。使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
AOP-面向切面编程

二、AOP有哪些专业术语?

  1. 连接点(Joinpoint):连接点是应用执行过程中能够插入切面的一个点。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
  2. 切点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点。通常使用明确的类和方法名称来指定这些切点,或是利用正则表达式定义匹配的类和方法名称模式来指定这些切点。切点用于准确定位应该是什么地方准确应用切面的通知。
  3. 通知(Advice):切面的工作被定义成通知,通知定义了切面是什么以及何时使用。Spring切面可以应用5种类型的通知:
    a. Before-在方法被调用之前调用通知;
    b. After-在方法调用之后调用通知,无论方法调用是否成功;
    c. After-returning-在方法成功执行之后调用通知;
    d. After-throwing-在方法抛出异常后调用通知;
    e. Around-通知包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的行为;
  4. 切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容-他是什么以及在何时何处完成自定义功能。
  5. 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。通过通知类,在被通知类无修改的情况下,让他们具有新的额属性和行为。
  6. 织入(Weaving):织入是将切面应用到目标对象来创建新的代理对象的过程,切面在指定的连接点被织入到指定的对象中。在目标对象的生命周期里有个点可以进行织入:
    a. 编译器-切面在目标编译器被织入,这种方式需要特殊的编译器,例如AspectJ;
    b. 类加载器-切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(Classloader);
    c. 运行期-切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。

三、SpringBoot中怎么实现AOP?

使用注解来创建切面是AspectJ5所引入的关键特性。AspectJ面向注解的模型可以非常简单地通过少量注解把任意类转换为切面(不需要使用Java语言扩展)。这种新特性通常称为@AspectJ。
引入依赖:
AOP-面向切面编程
开启自动代理,相当于xml配置 aop:aspectj-autoproxy/
AOP-面向切面编程
编写被代理对象:
AOP-面向切面编程
编写切面类:
AOP-面向切面编程
@Pointcut注解用于定义一个可以在@AspectJ切面内可重用的切点。@Pointcut注解的值是一个AspectJ切点表达式,这里表示该切点必须匹配perform方法。切点的名称来源于注解所应用的方法名称。因此,该切点的民称为performance()。performance()方法的实际内容并不重要,在这里它事实上是空的,其实该方法本身只是一个标识,供@Pointcut注解依附。
@Before注解标识是前置通知方法;
@AfterReturning注解标识是后置通知方法;
@ Around注解可以创建环绕通知;被环绕通知的方法必须接受一个ProceedingJoinPoint对象作为方法入参,并在对象上调用proceed()方法,proceed()方法的返回结果为被代理对象执行结果,可对结果进行校验处理。
查看控制台执行结果:
AOP-面向切面编程
本文案例代码可以从git上下载哦:https://github.com/STIll-clx/demo-aop.git

相关文章: