🍁 作者:知识浅谈,CSDN签约讲师,CSDN原力作者,后端领域优质创作者,热爱分享创作
💒 公众号:知识浅谈
📌 擅长领域:全栈工程师、爬虫、ACM算法
🔥 联系方式vx:zsqtcc
正菜来了🛴🛴🛴
🎈启发
SpringAOP可以帮助我们Java在不修改源代码的前提下实现功能增强,其底层实现基于Java 动态代理或者cglib。由于Spring的声明式事务注解@Transactional的启发,我们在项目中利用自定义的注解实现大量共性的需求。
🎈应用场景
需要灵活使用共性需求的地方都可以使用该方案
- 收集上报指定关键方法的入参,执行时间,返回结果等关键信息,用作后期的调优。
- 关键方法在幂等性的前置校验(基于本地消息表)
- 类似于Spring-Retry模块,提供关键方法多次调用重试机制
- 提供关键方法自定义的快速熔断,服务降级等职责
- 关键方法在执行后的扩展行为,利如记录日志,启动其他任务等。
🎈开发过程
引入依赖📃
<!--主要是用于创建切面的使用--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency>
自定义注解📃
新建Spring Boot2.x工程,在pom.xml中增加aspectjweaver依赖
packagecom.example.springbootdemo.Tets; importjava.lang.annotation.ElementType; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importjava.lang.annotation.Target; //注解用在方法上ElementType.METHOD) (//@Retention作用是定义被它所注解的注解保留多久额,RUNTIME运行时,就是这个注解的存活时间RetentionPolicy.RUNTIME) (public@interfaceAnnotationTest { }
自定义切面📃
//下边的这个注解表示当前对象是一个切面publicclassMethodExporterAspect { //关键代码3:说明切面的作用范围,任何增加@AnnotationTest的目标方法都将在执行该切面方法//@Around环绕通知,最强大的通知类型,可以控制方法入参,执行,返回结果等各方面细节"@annotation(com.example.springbootdemo.Tets.AnnotationTest)") //这表示AnnotationTest注解修饰的方法使用这个自定义切面进行增强 (publicObjectmethodExporter(ProceedingJoinPointjoinPoint) throwsThrowable{ longtime=newDate().getTime(); //执行目标方法,获取方法返回值Objectproceed=joinPoint.proceed(); longet=newDate().getTime(); returnproceed; } }
测试切面📃
publicclassSampleController { "/list") (publicMaplist(){ HashMap<Object, Object>map=newHashMap<>(); map.put("code","0"); returnmap; } }
网络异常,图片无法展示
|