从零开始 Spring Boot 26:AOP
这篇文章是我早期学习AOP的理解,关于Spring AOP,在学习官方文档后,我写了一篇更全面深入的文章,感兴趣的可以阅读从零开始 Spring Boot 32:AOP II - 红茶的个人站点 (icexmoon.cn)。
AOP全称为Aspect Oriented Programming,即面向切面编程。
一次HTTP请求大概可以用下图表示:
如果用MVC的观点划分Spring Boot应用内的消息流转,大概可以用下图表示:
假设我们要在Spring Boot应用每次处理请求前后都加上日志,可能会这么做:
package cn.icexmoon.books2.book.controller;
// ...
@RestController
@RequestMapping("/book/book")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping("/{id}")
public Book getBookInfo(@PathVariable int id) {
MyLogUtil.doLogging("before getBookInfo request");
try {
return bookService.getBookById(id);
} finally {
MyLogUtil.doLogging("after getBookInfo request");
}
}
@Data
@NoArgsConstructor
private static class PageBooksDTO {
@NotNull
private BookQueryDTO query;
private Integer page;
private Integer limit;
}
@PostMapping("/page")
public List<Book> pageBooks(@RequestBody PageBooksDTO dto) {
MyLogUtil.doLogging("before pageBooks request");
try {
return bookService.pageBooks(dto.getPage(), dto.getLimit(), dto.getQuery());
} finally {
MyLogUtil.doLogging("after pageBooks request");
}
}
@PostMapping("/add")
public Result addBook(@RequestBody BookDTO dto) {
MyLogUtil.doLogging("before addBook request");
try {
Integer newId = bookService.addBook(dto);
return Result.success(newId);
} finally {
MyLogUtil.doLogging("after addBook request");
}
}
@PostMapping("/multip-add")
p