SpringBoot 集成Aop demo

阅读: 评论:0

SpringBoot 集成Aop   demo

SpringBoot 集成Aop demo

主要的maven依赖如下
<!--引入SpringBoot的Web模块-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!--引入AOP依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

注意:在完成了引入AOP依赖包后,不需要去做其他配置。AOP的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy,不需要在程序主类中增加@EnableAspectJAutoProxy来启用。

编写自定义注解

import java.lang.annotation.*;/*** @author Lxin* @version 1.0* @date 2020/5/7 9:23*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
public @interface Logs {/*** 操作** @return 操作*/Opts opts() ;/*** 使用者** @return 使用者*/String user() default "Lxin";/*** 所属机构** @return 所属机构*/String company() default "NBA";}

可有可无的

/*** @author Lxin* @version 1.0* @date 2020/5/7 9:23*/
public enum Opts {/*** 添加*/add,/*** 修改*/update,/*** 删除*/delete,/*** 查询*/get;}

主要的Controller入口

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author Lxin* @version 1.0* @date 2020/5/7 9:46*/
@RestController
public class AopLogsController{@RequestMapping(value = "/Kobe/Forever/{point}")@Logspublic void Kobe(@PathVariable("point") int point) {System.out.println("科比一直在打球!!");}@RequestMapping(value = "/LeBron")@Logspublic void LeBron() {System.out.println("詹姆斯上场打球了!!");}@RequestMapping(value = "/Curry")@Logspublic void Curry() {System.out.println("库里上场打球了!!");}@RequestMapping(value = "/Harden")@Logspublic void Harden() {System.out.println("哈登上场打球了!!");}@Logs@RequestMapping(value = "/Antetokounmpo")public void Antetokounmpo() {System.out.println("字母哥上场打球了!!");}@Logs@RequestMapping(value = "/Jokic")public void Jokic() {System.out.println("约基奇上场打球了!!");}@Logs@RequestMapping(value = "/Durant/{point}")public void Durant(@PathVariable("point") int point) {System.out.println(1 / 0);System.out.println("杜兰特上场打球了!!");}
}

切面类

注意:在类上添加@Aspect 和@Component 注解即可将一个类定义为切面类。
@Aspect 注解 使之成为切面类
@Component 注解 把切面类加入到IOC容器中

/*** @author Lxin* @version 1.0* @date 2020/5/7 9:37*/
@Aspect
@Component
public class LogsAspect {private static final Logger logger = Logger(LogsAspect.class);/*** 切入点 所有打上 Logs 的注解都会被扫描到*/@Pointcut("@aop.Logs)")public void aspect() {}/*** @description  在连接点执行之前执行的通知*/@Before("aspect()")public void doBeforeGame(){System.out.println("经纪人正在处理球星赛前事务!");}/*** @description  在连接点执行之后执行的通知(返回通知和异常通知的异常)*/@After("aspect()")public void doAfterGame(){System.out.println("经纪人为球星表现疯狂鼓掌!");}/*** @description  在连接点执行之后执行的通知(返回通知)*/@AfterReturning("aspect()")public void doAfterReturningGame(){System.out.println("返回通知:经纪人为球星表现疯狂鼓掌!");}/*** @description  在连接点执行之后执行的通知(异常通知)*/@AfterThrowing("aspect()")public void doAfterThrowingGame(){System.out.println("异常通知:球迷要求退票!");}

执行

调用 localhost:8080/Kobe/Forever/80

我们还可以使用更为强大的环绕通知

    /*** 环绕通知可以将你所编写的逻辑将被通知的目标方法完全包装起来。我们可以使用一个环绕通知来代替之前多个不同的前置通知和后置通知。* 如下所示,前置通知和后置通知位于同一个方法中,不像之前那样分散在不同的通知方法里面。** @description 使用环绕通知*/@Around("aspect()")public void doAroundGame(ProceedingJoinPoint pjp) throws Throwable {try {System.out.println("经纪人正在处理球星赛前事务!");//这个方法就相当于业务代码 它在上面  下面的代码就是相当于执行后,它在下面 就是相当于执行前pjp.proceed();//c先获取被织入增强处理的目标对象,再获取目标类的clazzClass<?> aClass = Target().getClass();//先获取目标方法的签名,再获取目标方法的名String methodName = Signature().getName();// 输出目标方法名logger.info("方法名: " + methodName);//获取目标方法参数类型Class[] parameterTypes = ((MethodSignature) Signature()).getParameterTypes();//获取目标方法的入参Object[] args = Args();for (int i = 0; i < args.length; i++) {//输出目标方法的参数logger.info("argsName: " + args[i]);System.out.println(methodName + "得到了 " + args[i] + " 分!!!");}//获取目标方法Method method = Method(methodName, parameterTypes);//获取方法上的注解Logs annotation = Annotation(Logs.class);//获取注解函数值Opts opts = annotation.opts();System.out.println(opts);System.out.println("返回通知:经纪人为球星表现疯狂鼓掌!");} catch (Throwable e) {System.out.println("异常通知:球迷要求退票!");}}

结果
调用 localhost:8080/Kobe/Forever/80

异常通知也是OK的

调用 localhost:8080/Durant/60

谢谢 观看

本人学习来源 .html

本文发布于:2024-02-02 15:33:18,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170685919744739.html

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

标签:SpringBoot   Aop   demo
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23