AOP 切面编程基础使用
Spring AOP(Aspect-Oriented Programming)切面编程是Spring框架提供的一种编程范式,用于增强现有的Java代码功能而无需修改原始代码。它是面向切面的编程方法,通过在应用程序的关键位置插入代码片段,实现对于特定行为的拦截和控制。
SpringBoot如何使用AOP切面编程?
1.在pom.xml中引入AOP依赖
1 2 3 4 5
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
|
2.新建一个AopAdvice类,并在类的开头加入@Aspect注解
- 定义一个切面
1 2 3 4 5 6 7 8 9
|
@Pointcut("execution (* com.personapi.controller.BlogController.getId(..))") public void myPointCut() {
}
|
3.@Before注解
@Before表示在方法执行之前调用1 2 3 4 5 6 7 8 9 10 11 12
|
@Before("myPointCut()") public void beforeAdvice(JoinPoint jp) throws JsonProcessingException { String className = jp.getTarget().getClass().toString(); String methodName = jp.getSignature().getName(); Object[] args = jp.getArgs();
ObjectMapper mapper = new ObjectMapper(); log.info("调用前:" + className + ":" + methodName + "传递的参数为:" + mapper.writeValueAsString(args)); }
|
4.@AfterReturning注解
该方法表示后置通知,方法执行之后执行1 2 3 4 5 6 7 8 9 10 11
|
@AfterReturning(pointcut = "myPointCut()", returning = "result") public void afterAdvice(JoinPoint jp, Object result) throws JsonProcessingException { String className = jp.getTarget().getClass().toString(); String methodName = jp.getSignature().getName();
ObjectMapper mapper = new ObjectMapper(); log.info("调用后:" + className + ":" + methodName + "返回值:" + mapper.writeValueAsString(result)); }
|
5.@Around注解
@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
@Around("myPointCut()") public void aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { String className = pjp.getTarget().getClass().toString(); String methodName = pjp.getSignature().getName(); Object[] args = pjp.getArgs();
ObjectMapper mapper = new ObjectMapper(); log.info("调用前:" + className + ":" + methodName + "传递的参数为:" + mapper.writeValueAsString(args));
Object obj = pjp.proceed();
log.info("调用前:" + className + ":" + methodName + "返回值:" + mapper.writeValueAsString(obj)); }
|
6.AopAdvice完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| @Component @Aspect @Slf4j public class AopAdvice {
@Pointcut("execution (* com.personapi.controller.BlogController.getId(..))") public void myPointCut() {
}
@Before("myPointCut()") public void beforeAdvice(JoinPoint jp) throws JsonProcessingException { String className = jp.getTarget().getClass().toString(); String methodName = jp.getSignature().getName(); Object[] args = jp.getArgs();
ObjectMapper mapper = new ObjectMapper(); log.info("调用前:" + className + ":" + methodName + "传递的参数为:" + mapper.writeValueAsString(args)); }
@AfterReturning(pointcut = "myPointCut()", returning = "result") public void afterAdvice(JoinPoint jp, Object result) throws JsonProcessingException { String className = jp.getTarget().getClass().toString(); String methodName = jp.getSignature().getName();
ObjectMapper mapper = new ObjectMapper(); log.info("调用后:" + className + ":" + methodName + "返回值:" + mapper.writeValueAsString(result)); }
@Around("myPointCut()") public void aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { String className = pjp.getTarget().getClass().toString(); String methodName = pjp.getSignature().getName(); Object[] args = pjp.getArgs();
ObjectMapper mapper = new ObjectMapper(); log.info("调用前:" + className + ":" + methodName + "传递的参数为:" + mapper.writeValueAsString(args));
Object obj = pjp.proceed();
log.info("调用前:" + className + ":" + methodName + "返回值:" + mapper.writeValueAsString(obj)); } }
|