一、 什么是aop
百度的解释:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
我的个人理解:java中,每个类对于都是一个闭合的实体,在编程中有时候需要在已经开发完成的类中通过一项技术嵌入一些公用的方法,这项技术不用改变原代码。而这项技术就是面向切面编程,也就是aop。
二、 aop中的一些概念
了解了aop是什么之后,我们再看一下aop中有哪些东西:
1、切面(Aspect)
切面对于aop来说是一个类,这个类封装了嵌入到目标方法时,一些相关信息。
2、连接点(join point)
这个点就是所有在程序中明确定义的点,如方法调用,对类成员的访问以及异常处理程序块的执行等等。
3、切点(pointcut)
定义了一组有特殊修饰的连接点的规则,这些规则可以是正则、通配符等。
4、通知(advice)
在切点中需要执行的业务逻辑操作。
上述概念比较模糊,我们通过一些例子来类比一下:比如,我们去商场买衣服的时候,我们不知道哪些合适,所以我们把我们的身高体重跟导购说了之后,导购根据这些信息,给你找出来一些衣服试穿。这个例子中,切面(Aspect)就相当于我们去商场买衣服这个事件,连接点(join point)相当于商店中的所有衣服,而切点(pointcut)就是我们的身高体重,通知(advice)就是导购找到衣服之后给我们试穿。这个例子可能不太准确,但是差不多就这个意思。
三、利用aop实现项目中日志的嵌入
通常我们在项目中需要用到日志,日志用aop是怎么实现的呢?
1、首先在pom文件中引入依赖:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
2、创建个切面类
image.png
3、在切面类中编写切点和通知
/**
- @description 切点
*/
@Pointcut("@annotation(com.zyjournals.web.journaladmin.config.annotation.ArticleProcessLogAnn)")
public void pointCutMethod(){
}
/**
- @description 通知
*/
@Before("pointCutMethod()")
public void doBefore(JoinPoint joinPoint){
System.out.println("方法执行前");
}
4、编写测试类
package com.yangkun.esstudy.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/log")
public class LogTestController {
@GetMapping("test")
public String test(){
return "hello world";
}
}
5、测试结果
image.png 切入成功!
思考
aop面向切面编程,其实就是一个切面中包含的切点(寻找符合规则的连接点切入)和执行动作(通知),在找到符合的切点之后,根据通知的类型(前置通知、后置通知、环绕通知等)执行通知的业务逻辑,从而实现业务代码中嵌入log日志等与业务无关的代码逻辑。