AOP切面编程基础使用
ClearSky Drizzle Lv4

AOP 切面编程基础使用

Spring AOP(Aspect-Oriented Programming)切面编程是Spring框架提供的一种编程范式,用于增强现有的Java代码功能而无需修改原始代码。它是面向切面的编程方法,通过在应用程序的关键位置插入代码片段,实现对于特定行为的拦截和控制。

SpringBoot如何使用AOP切面编程?

1.在pom.xml中引入AOP依赖

1
2
3
4
5
<!--aop 切面-->
<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
    /**
    * @dev execution (* com.personapi.controller.BlogController.getId(..))
    * * controller包名.定义切面的类.定义切面的方法(任何参数)
    * * com.personapi.controller.*.*(..)) 表示定义controller包下所有类,所有方法,任何参数
    */
    @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
    /**
    * @dev 调用之前执行
    */
    @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
    /**
    * @dev 调用之后执行
    */
    @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
/**
* @dev 环绕执行
* @param pjp
*/
@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 {
/**
* @dev execution (* com.personapi.controller.BlogController.getId(..))
* * controller包名.定义切面的类.定义切面的方法(任何参数)
* * com.personapi.controller.*.*(..)) 表示定义controller包下所有类,所有方法,任何参数
*/
@Pointcut("execution (* com.personapi.controller.BlogController.getId(..))")
public void myPointCut() {

}

/**
* @dev 调用之前执行
*/
@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));
}

/**
* @dev 调用之后执行
*/
@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));
}

/**
* @dev 环绕执行
* @param pjp
*/
@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));
}
}
 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
This site is deployed on
Unique Visitor Page View