AOP知识点

1 Spring AOP简介

1.1 AOP简介

1.1.1 AOP是什么?

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善。它以通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。
在这里插入图片描述

AOP 应用场景分析?

实际项目中通常会将系统分为两大部分,一部分是核心业务,一部分是非核业务。在编程实现时我们首先要完成的是核心业务的实现,非核心业务一般是通过特定方式切入到系统中,这种特定方式一般就是借助AOP进行实现。

AOP就是要基于OCP(开闭原则),在不改变原有系统核心业务代码的基础上动态添加一些扩展功能并可以"控制"对象的执行。例如AOP应用于项目中的日志处理,事务处理,权限处理,缓存处理等等。
在这里插入图片描述

1.1.3AOP 应用原理分析(先了解)?

Spring AOP底层基于代理机制实现功能扩展:
1.假如目标对象(被代理对象)实现接口,则底层可以采用JDK动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)。
2.假如目标对象(被代理对象)没有实现接口,则底层可以采用CGLIB代理机制为目标对象创建代理对象(默认创建的代理类会继承目标对象类型)。
Spring AOP 原理分析:如图
在这里插入图片描述
说明:Spring boot2.x 中AOP现在默认使用的CGLIB代理,假如需要使用JDK动态代理可以在配置文件(applicatiion.properties)中进行如下配置:
spring.aop.proxy-target-class=false

1.2 AOP 相关术语分析

  1. 切面(aspect):横切面对象,一般为一个具体类对象(可以借助@Aspect声明)。
  2. 通知(Advice):在切面的某个特定连接点上执行的动作(拓展功能),例如:around,before,after等。
  3. 连接点(joinpoint):程序执行过程中某个特殊的点,一般指被拦截到的方法。
  4. 切入点(pointcut):对多个连接点(joinpoint)一种定义,一般可以理解为多个连接点的集合。

2.Spring AOP快速实践

创建maven项目或在已有项目基础上添加AOP启动依赖:

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

说明:基于此依赖spring可以整合AspectJ框架快速完成AOP的基本实现。AspectJ 是一个面向切面的框架,他定义了AOP的一些语法,有一个专门的字节码生成器来生成遵守java规范的class文件。

创建日志切面类对象
package com.cy.pj.common.aspect;
@Aspect
@Slf4j
@Component
public class SysLogAspect {
	 @Pointcut("bean(sysUserServiceImpl)")
	 public void doLogPointCut() {}
 
	 @Around("doLogPointCut()")
	 public Object around(ProceedingJoinPoint jp)
	 throws Throwable{
		 try {
		   log.info("start:{}"+System.currentTimeMillis());
		   Object result=jp.proceed();//最终会调用目标方法
		   log.info("after:{}"+System.currentTimeMillis());
		   return result;
		 }catch(Throwable e) {
		   log.error("after:{}",e.getMessage());
		   throw e;
		 }
	 }
}

说明:

  1. @Aspect 注解用于标识或者描述AOP中的切面类型,基于切面类型构建的对象用于为目标对象进行功能扩展或控制目标对象的执行。
  2. @Pointcut注解用于描述切面中的方法,并定义切面中的切入点(基于特定表达式的方式进行描述),在本案例中切入点表达式用的是bean表达式,这个表达式以bean开头,bean括号中的内容为一个spring管理的某个bean对象的名字。
  3. @Around注解用于描述切面中的方方达,这样的方法会被认为是一个环绕通知(黑心业务方法执行之前和之后要执行的一个动作),@Around注解内部value属性的值为一个切入点表达式或者是切入点表达式的一个引用(这个引用为一个@Pointcut注解描述的方法的方法名)。
  4. ProceedingJoinPoint类为一个连接点类型,此类型的对象用于封装要执行的目标方法相关的一些信息。只能用于@Around注解描述的该方法参数。

3.通知类型

  1. 前置通知@Before 目标方法执行之前执行

  2. 后置通知@After 目标方法执行之后执行

  3. 异常通知@Afterthrowing 目标方法执行过程中抛出异常时执行

  4. 最终通知@AfterReturning 无论什么时候都要执行的通知
    特点: 上述的四大通知类型 不能干预目标方法是否执行.一般用来做程序运行状态的记录.监控

  5. 环绕通知@Around 在目标方法执行前后都要执行的通知方法 该方法可以控制目标方法是否运行.joinPoint.proceed(); 功能作为强大的.

3.1通知执行顺序在这里插入图片描述

3.2 切入点表达式增强

Spring AOP 中切入点表达式说明
bean:用于匹配指定bean对象的所有方法
within:用于匹配指定包下所有类内的所有方法
execution:用于按指定语法规则匹配到具体方法
@annotation :用于匹配指定注解修饰的方法

3.2.1bean表达式(重点)

ctrl+T:查找子类和实现类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值