AOP
1.什么是AOP?
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP:它是面向切面编程的语言,它可以让你的业务代码和非业务代码进行隔离。在不改变业务代码的前提下,可以增加新的非业务代码。
2.为什么使用AOP?
1.分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
2.减少代码的重复,各个模块的重用性加强。
3.降低 模块间的耦合度,提高代码的可操作性和可维护性。
如果我们不适用AOP,那么必然会导致项目中的日志与具体的业务逻辑都写在一起,而且是每一个接口里面都需要日志,那么日志的代码数量远远超过具体业务逻辑代码,这样不利于后期的维护已修改。同时违背了软件设计的思想。如果使用的AOP,我们把这种不是必然需要的同时也是服务具体业务的模块单独分装起来,在业务逻辑前或后直接调用,从而提高代码的可操作性和可维护性。
3.AOP的应用场景
- 记录日志
- 权限校验
- spring事务管理。
4.AOP的结构
AOP要做的三件事在哪里切入,也就是权限校验,等非业务操作在哪些业务 代码中执行;什么时候切入,是业务代码执行前还是执行后;切入后做什 么事,比如做权限校验、日志记录等。
- Aspect: 切面
- PointCut:切点:—方式: 路径表达式 (2)注解形式
- Advice: 处理的时机
5.如何使用AOP
public class MathServiceImpl implements MathService {
public double add(double a, double b) {
double result=a+b;
System.out.println("AAA--->The add method result="+result);
return result;
}
public double mul(double a, double b) {
double result=a-b;
System.out.println("AAA--->The mul method result="+result);
return result;
}
public double cheng(double a, double b) {
double result=a*b;
System.out.println("AAA--->The cheng method result="+result);
return result;
}
public double div(double a, double b) {
double result=a/b;
System.out.println("AAA--->The div method result="+result);
return result;
}
}
发现: 我们在每个操作后,都要记录日志,如果后期日志内容发生改变。需要在每个操作后都进行修改。 不利于代码的维护。
我们来使用AOP来解决。
5.1路径表达式(execution)模式
(1)引入相关依赖
<dependencies>
<!--引入spring核心依赖库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<!--引入spring切面依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
(2)创建一个切面类
//标记给类为切面类
@Aspect
//该类对象的创建交于spring容器来管理 等价于@Service @Controller
@Component
public class MyAspect {
//定义为切点
@Pointcut(value = "execution(public double com.aaa.aop.MathServiceImpl.add(double, double))")
private void mypointcut(){
}
@After(value = "mypointcut()")
public void a(){
System.out.println("AAA---->The method result");
}
}
(3) 创建一个spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context