基于注解的AOP
1 . 准备工作
① 添加依赖
在ioc所需依赖基础上再加入下面依赖即可:
就是所实现的aop也是在ioc容器的基础上实现的。
所以spring最重要的核心就是ioc。
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.18</version>
</dependency>
②接口
public interface Calculator {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
③实现类
2 . 注解的AOP
将前置通知通过切入点表达式作用到了连接点上
切面:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* 创建切面
* 如果要实现aop:把切面和目标对象交给ioc管理
* 1.
* 切面类必须通过@Asprct注解标识为一个切面
*/
//必须把切面类和目标类作为ioc容器中的组件
<!--
AOP的注意事项:
切面类和目标类都需要交给IOC容器管理
切面类必须通过@Asprct注解标识为一个切面
在spring的配置文件中设置 <aop:aspectj-autoproxy /> 开启基于注解的aop功能
-->
<context:component-scan base-package="com.atguigu.spring.aop.annotation"></context:component-scan>
<!-- 开启基于注解的aop功能 -->
<aop:aspectj-autoproxy />
测试类:
/**
* 前置方法表示这个类中所有的方法设置前置通知
* 切入点表达式:设置在标识通知的注解value属性中
* @Before("execution(.....)")
* 第一个*表示任意的访问修饰符和返回值类型
* 第二个*表示类中任意的方法
* ..任意参数列表
* 在类的地方也可以写*,表示包下所有的类
* ()表示的是:当前方法的参数列表,
* 方法存在重载,括号里面为空表示的是就是无惨的方法
* 不在乎方法的参数是什么,只要是个方法就加前置通知,就写..
*/
Calculator bean = ioc.getBean(Calculator.class);
bean.add(1,2);
bean.div(1,2);
/**
* LoggerAspect ,前置通知
* 方法内部,result:3
* LoggerAspect ,前置通知
* 方法内部,result:0
*/
重用切入点表达式
切面
/**
* 2. 重用切入点表达式
* @Pointcut:声明一个公共的切入点表达式
* 使用方式:
* 例: @Before("pointCut()") :括号里写的就是当前方法的方法名
* 声明功能的表达式
*/
获取连接点的信息
在通知方法的参数位置,设置JoinPoint类型的参数,就可以获取连接点所对应方法的信息
切面
Calculator bean = ioc.getBean(Calculator.class);
bean.add(1,2);
bean.div(1,2);
/**
* LoggerAspect ,方法:add,参数:[1, 2]
* 方法内部,result:3
* LoggerAspect ,方法:div,参数:[1, 2]
* 方法内部,result:0
*/
其他通知
/**
* @After:后置通知,在目标对象方法的finally子句中执行的
*@AfterReturning:返回通知,在目标对象方法返回值之后执行(目标对象有异常不执行)
* 在返回通知中若要获取目标对象方法的返回值,只需要通过@AfterReturning注解的returning属性
* 就可以将通知方法的某个参数指定为接收目标对象方法的返回值的参数
* @AfterThrowing:异常通知在目标对象方法的catch子句中执行
* 在异常通知中获取目标对象的异常只需要通过@AfterThrowing注解的throwing属性
* 就可以将通知方法的某个参数指定为接收目标对象方法出现异常的参数
*/
环绕通知
切面的优先级
而每一个优先级都有默认值,integer最大值。
value值越小,优先级越低。

浙公网安备 33010602011771号