AOP切面编程
为什么要用AOP切面编程? 增加核心业务逻辑代码以外的额外功能
切面=通知(额外功能)+切入点
通知(额外功能):额外功能的实现类,比如说一个切面类
切入点:相当于核心功能和额外功能的一个连接点,重点是切入点表达式
原理:动态代理技术
依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
一、三种切入点表达式
1、方法级别的切入点表达式:作用于方法上
格式:execution(* com.hao.service.*.*(..))
2、类级别的切入点表达式:作用于类上
格式:within(com.hao.service.*)
3、基于注解的切入点表达式
简单理解就是把一个额外功能与我们新创建的一个注解与之关联
使用了我们创建的注解就可以用到这个额外功能
格式:@annotation(com.hao.annotation.MyAdvise)
写完切入点表达式
然后创建新的注解
将新注解写在方法上
/**
* Created with IntelliJ IDEA.
*
* @Author: Yzh
* @Date: 2021/08/15/16:15
* @Description:
*/
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
//作用于方法上
@Target(ElementType.METHOD)
public @interface MyAdvise {
}
二、切面的三种类型
前置切面
@Configuration //说明是一个配置类
@Aspect //说明是一个切面类
public class MyAspect {
/**
* @Author: yzh
* @Description: 前置切面,记住返回值为void
* @Param: [joinPoint]
* @return: void
* @Date: 2021/8/15
*/
@Before("execution(* com.hao.service.*.*(..))")
public void before(JoinPoint joinPoint){
System.out.println("前置通知");
joinPoint.getTarget();//目标对象
joinPoint.getSignature();//方法签名
joinPoint.getArgs();//方法参数
}
}
后置切面
@Configuration //说明是一个配置类
@Aspect //说明是一个切面类
public class MyAspect {
/**
* @Author: yzh
* @Description: 后置切面,返回值为void
* @Param: [joinPoint]
* @return: void
* @Date: 2021/8/15
*/
@After("execution(* com.hao.service.*.*(..))")
public void after(JoinPoint joinPoint){
System.out.println("后置通知");
joinPoint.getTarget();//目标对象
joinPoint.getSignature();//方法签名
joinPoint.getArgs();//方法参数
}
环绕切面
@Configuration //说明是一个配置类
@Aspect //说明是一个切面类
public class MyAspect {
/**
* @Author: yzh
* @Description: 环绕通知,注意返回值为Object,记得要return
* @Param: [proceedingJoinPoint]
* @return: java.lang.Object
* @Date: 2021/8/15
*/
@Around("execution(* com.hao.service.*.*(..))")
public Object before(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("进入环绕通知");
proceedingJoinPoint.getTarget();//目标对象
proceedingJoinPoint.getSignature();//方法签名
proceedingJoinPoint.getArgs();//方法参数
Object proceed = proceedingJoinPoint.proceed();//放行执行目标方法
System.out.println("目标方法执行之后回到环绕通知");
return proceed;//返回目标方法返回值
}
总结
使用步骤
引入依赖-->开发切面类-->写好切入点表达式-->注解的话需要在方法上加注解
aop切面编程的底层就是动态代理,使用aop切面编程可以减少核心业务逻辑代码的代码冗余,减少代码量。完成核心业务逻辑以外的额外功能。
本文介绍了Spring AOP切面编程的概念,包括为什么使用AOP来添加额外功能,以及如何通过切入点表达式定义通知的触发条件。讲解了三种类型的切入点表达式,并展示了如何创建自定义注解关联通知。同时,详细阐述了前置、后置和环绕切面的实现方式,通过代码实例展示了如何在方法执行前后插入额外操作。总结了AOP的使用步骤,并强调了其减少代码冗余的作用。
400

被折叠的 条评论
为什么被折叠?



