springboot中的5种通知⼩例⼦springboot中的5种通知的⼩例⼦
1.环境搭建
pom中导⼊
<!--增加AOP需要的包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
application.properties⽂件中配置
#Spring AOP
spring.aop.auto=true
spring.aop.proxy-target-class=true
类上⾯增加@Aspect标注
2.切⼊点表达式
/**
* 定义⼀个⽅法, ⽤于声明切⼊点表达式. ⼀般地, 该⽅法中再不需要添⼊其他的代码.
* 使⽤ @Pointcut 来声明切⼊点表达式.
* 后⾯的其他通知直接使⽤⽅法名来引⽤当前的切⼊点表达式.
* (..)表⽰任意参数
*/
@Pointcut("execution(public int health.service.ArithmeticCalculator.*(..))")
public void declareJointPointExpression() {
}
3.前置通知
//声明该⽅法执⾏之前执⾏,前置通知
//直接导⼊切⾯点,上⾯的
@Before("declareJointPointExpression()")
public void beforeMethod(JoinPoint joinPoint) {
String methodName = Signature().getName();
Object[] args = Args();
System.out.println("这是切⾯开始打印出来的--->The method " + methodName + " begins with " + Arrays.asList(args));    }
4.后置通知
//后置通知:在⽬标⽅法执⾏后(⽆论是否发⽣异常),执⾏通知
//在后置通知中还不能访问⽬标⽅法的执⾏的结果,不是在执⾏⽅法后调⽤的
/**
* 这是切⾯开始打印出来的--->The method add begins with [3, 5]
* 这是切⾯结束打印出来的--->The method add ends
* 和--->8
*/
@After("declareJointPointExpression()")
public void afterMethod(JoinPoint joinPoint) {
String methodName = Signature().getName();
System.out.println("这是切⾯结束打印出来的--->The method " + methodName + " ends");    }
5.带有返回值通知
/
**
* 带有返回值的切⾯
* 在⽅法法正常结束受执⾏的代码
* 返回通知是可以访问到⽅法的返回值的!
* 可以使⽤returning = "result"进⾏获取后得到
*/
@AfterReturning(value = "declareJointPointExpression()",
returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
String methodName = Signature().getName();
System.out.println("The method " + methodName + " ends with " + result);
}
6.异常通知
/**
* 异常处理切⾯
* 在⽬标⽅法出现异常时会执⾏的代码.
* 可以访问到异常对象; 且可以指定在出现特定异常时在执⾏通知代码
*/
@AfterThrowing(value = "declareJointPointExpression()",
throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Exception e) {
String methodName = Signature().getName();
System.out.println("The method " + methodName + " occurs excetion:" + e);
}
7.环绕通知
/**
* 环绕切⾯,⼀般⽤的不是很多,类似于动态代理,可以包含前⾯4种的任意个
* 环绕通知需要携带 ProceedingJoinPoint 类型的参数.
* 环绕通知类似于动态代理的全过程: ProceedingJoinPoint 类型的参数可以决定是否执⾏⽬标⽅法.
* 且环绕通知必须有返回值, 返回值即为⽬标⽅法的返回值
*/
/*
@Around("execution(public int com.atguigu.spring.aop.ArithmeticCalculator.*(..))")
public Object aroundMethod(ProceedingJoinPoint pjd){
Object result = null;
String methodName = Signature().getName();
try {
//前置通知
System.out.println("The method " + methodName + " begins with " + Arrays.Args()));            //执⾏⽬标⽅法
result = pjd.proceed();
//返回通知
System.out.println("The method " + methodName + " ends with " + result);
} catch (Throwable e) {
//异常通知
System.out.println("The method " + methodName + " occurs exception:" + e);
throw new RuntimeException(e);
}
//后置通知
System.out.println("The method " + methodName + " ends");
return result;
}
*/
优先级
/**
* 可以使⽤ @Order 注解指定切⾯的优先级, 值越⼩优先级越⾼
*/
@Order(2)
完整的切⾯例⼦
//通过添加 @Aspect 注解声明⼀个 bean 是⼀个切⾯!
/**
* 可以使⽤ @Order 注解指定切⾯的优先级, 值越⼩优先级越⾼
*/
@Order(2)
@Aspect
@Component
@Slf4j
public class LoggingAspect {
/**
* 定义⼀个⽅法, ⽤于声明切⼊点表达式. ⼀般地, 该⽅法中再不需要添⼊其他的代码.
* 使⽤ @Pointcut 来声明切⼊点表达式.
* 后⾯的其他通知直接使⽤⽅法名来引⽤当前的切⼊点表达式.
* (..)表⽰任意参数
*/
@Pointcut("execution(public int health.service.ArithmeticCalculator.*(..))")
@Pointcut("execution(public int health.service.ArithmeticCalculator.*(..))")
public void declareJointPointExpression() {
}
/
/声明该⽅法执⾏之前执⾏,前置通知
//直接导⼊切⾯点,上⾯的
@Before("declareJointPointExpression()")
public void beforeMethod(JoinPoint joinPoint) {
String methodName = Signature().getName();
Object[] args = Args();
System.out.println("这是切⾯开始打印出来的--->The method " + methodName + " begins with " + Arrays.asList(args));    }
//后置通知:在⽬标⽅法执⾏后(⽆论是否发⽣异常),执⾏通知
//在后置通知中还不能访问⽬标⽅法的执⾏的结果,不是在执⾏⽅法后调⽤的
/**
* 这是切⾯开始打印出来的--->The method add begins with [3, 5]
* 这是切⾯结束打印出来的--->The method add ends
* 和--->8
*/
@After("declareJointPointExpression()")
public void afterMethod(JoinPoint joinPoint) {
String methodName = Signature().getName();
System.out.println("这是切⾯结束打印出来的--->The method " + methodName + " ends");
}
/**
* 带有返回值的切⾯
* 在⽅法法正常结束受执⾏的代码
* 返回通知是可以访问到⽅法的返回值的!
* 可以使⽤returning = "result"进⾏获取后得到
*/
@AfterReturning(value = "declareJointPointExpression()",
returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
String methodName = Signature().getName();
System.out.println("The method " + methodName + " ends with " + result);
}
/**
* 异常处理切⾯
* 在⽬标⽅法出现异常时会执⾏的代码.
* 可以访问到异常对象; 且可以指定在出现特定异常时在执⾏通知代码
*/
@AfterThrowing(value = "declareJointPointExpression()",
throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Exception e) {
String methodName = Signature().getName();
System.out.println("The method " + methodName + " occurs excetion:" + e);
}
/**
* 环绕切⾯,⼀般⽤的不是很多,类似于动态代理,可以包含前⾯4种的任意个
* 环绕通知需要携带 ProceedingJoinPoint 类型的参数.
* 环绕通知类似于动态代理的全过程: ProceedingJoinPoint 类型的参数可以决定是否执⾏⽬标⽅法.
* 且环绕通知必须有返回值, 返回值即为⽬标⽅法的返回值
*/
/*
@Around("execution(public int com.atguigu.spring.aop.ArithmeticCalculator.*(..))")
springboot aoppublic Object aroundMethod(ProceedingJoinPoint pjd){
Object result = null;
String methodName = Signature().getName();
try {
try {
/
/前置通知
System.out.println("The method " + methodName + " begins with " + Arrays.Args()));            //执⾏⽬标⽅法
result = pjd.proceed();
//返回通知
System.out.println("The method " + methodName + " ends with " + result);
} catch (Throwable e) {
//异常通知
System.out.println("The method " + methodName + " occurs exception:" + e);
throw new RuntimeException(e);
}
//后置通知
System.out.println("The method " + methodName + " ends");
return result;
}
*/
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。