🍁 作者:知识浅谈,CSDN签约讲师,后端领域优质创作者,阿里云社区技术博主,热爱分享创作 💒 公众号:知识浅谈 📌 擅长领域:全栈工程师、爬虫、ACM算法
正菜来了🛴🛴🛴
SpringAOP可以帮助我们Java在不修改源代码的前提下实现功能增强,其底层实现基于Java 动态代理或者cglib。 由于Spring的声明式事务注解@Transactional的启发,我们在项目中利用自定义的注解实现大量共性的需求。
需要灵活使用共性需求的地方都可以使用该方案
<!--主要是用于创建切面的使用-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
新建Spring Boot2.x工程,在pom.xml中增加aspectjweaver依赖
package com.example.springbootdemo.Tets;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解用在方法上
@Target(ElementType.METHOD)
//@Retention作用是定义被它所注解的注解保留多久额,RUNTIME运行时,就是这个注解的存活时间
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
}
//下边的这个注解表示当前对象是一个切面
@Aspect
@Component
@Slf4j
public class MethodExporterAspect {
//关键代码3:说明切面的作用范围,任何增加@AnnotationTest的目标方法都将在执行该切面方法
//@Around环绕通知,最强大的通知类型,可以控制方法入参,执行,返回结果等各方面细节
@Around("@annotation(com.example.springbootdemo.Tets.AnnotationTest)") //这表示AnnotationTest注解修饰的方法使用这个自定义切面进行增强
public Object methodExporter(ProceedingJoinPoint joinPoint) throws Throwable{
long time = new Date().getTime();
//执行目标方法,获取方法返回值
Object proceed = joinPoint.proceed();
long et = new Date().getTime();
return proceed;
}
}
@RestController
public class SampleController {
@AnnotationTest
@GetMapping("/list")
public Map list(){
HashMap<Object, Object> map = new HashMap<>();
map.put("code","0");
return map;
}
}