在Spring Boot中使用AOP

一个Spring Boot中使用AOP的例子。

准备活动

在pom.xml文件中添加:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

新建一个controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class TestAopController {
@Timer
@GetMapping("/testaop")
public String testAop() {
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
return "testAop";
}
}

Timer是自定义的一个注解,虽然是自定义,但是可以通过@Pointcut捕获。

实现AOP相关类

具体代码如下:

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
@Aspect
@Component
public class AspectTest {
long start;
// ThreadLocal<Long> beginTime = new ThreadLocal<>();
//定义切点
@Pointcut("@annotation(com.cg.springbootdemo.annotation.Timer)")
public void timer(){}
//在方法执行前执行
@Before("timer()")
public void before() {
start = currentTimeMillis();
// beginTime.set(System.currentTimeMillis());
System.out.println("start: " + start);
}
//在方法执行后执行
@After("timer()")
public void after() {
long now = System.currentTimeMillis();
System.out.println("now: " + now);
// System.out.println(now - beginTime.get());
System.out.println(now - start);
}
}

注意上面代码的具体细节,比如@Before中参数写法。

小结

实现起来确实轻快方便。