org.example;
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
* aop组件
*/
@Aspect
@Component
public class AspectComponent {

@Pointcut("execution(* org.example.*.*(..))")
public void pointCut(){

}


// 在目标方法 没有执行的时候开始执行 一般用于改变某个方法的入参值
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
User arg = (User) args[0];
System.out.println(arg.getName()+"xingming");
arg.setName("doulongfe");
System.out.println(args);
System.out.println("before------------"+joinPoint.toString());
}

// 在目标方法执行return前执行 一般可以用于在return前执行插入的业务逻辑
@After("pointCut()")
public void after(JoinPoint joinPoint) {
Object target = joinPoint.getTarget();
System.out.println(target);
System.out.println("after-----------"+joinPoint.toString());
}


// 如果同时使用了@Around 这个切面方法的话,这里的返回值是@Around方法的返回值。并不是原来方法的返回值。【出现异常,不执行】
// 一般用于 修改返回值,或者拿到返回值后再执行自己一段业务逻辑
@AfterReturning(pointcut = "pointCut()", returning = "returnVal")
public void afterReturning(JoinPoint joinPoint, Object returnVal) {
User user = (User) returnVal;
System.out.println(user+"更新后返回值");
System.out.println("afterReturning--------------"
+ returnVal +joinPoint.toString());
}

// 一顶要把pjp.proceed();的值return出去,否则会是@AfterReturning 拿不到返回值。
@Around("pointCut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("around start-------===========--------");
try {
Object proceed = pjp.proceed();
System.out.println(proceed+"返回值");
return proceed;
} catch (Throwable ex) {
System.out.println("error in around");
// throw ex;
}
System.out.println("around end---------===============-----------");
return null;
}

@AfterThrowing(pointcut = "pointCut()", throwing = "error")
public void afterThrowing(JoinPoint joinPoint, Throwable error) {
System.out.println("error:" + error+joinPoint.toString());
}

// @Around ==》 @Before ==》 @Around ==》 @After ==》 @AfterReturning
// @AfterThrowing : 执行目标方法时发生了异常,导致目标方法结束执行。然后@AfterReturning不会执行(目标方法是抛出异常)。目标方法自己有
// try-catch没有抛出异常,@AfterReturning会正常执行,只不过拿到的返回值为null。

}