AOP(Aspect Oriented Programming)面向切面的编程
简单点说就是对一个方法执行的特殊点插入一些处理,在这些点执行这些特殊的处理。
例如BookService的showBookInfo方法,我们在该方法的Before,After,Around,AfterReturning,AfterThrowing等特殊点插入执行一些特殊的处理。
几个术语:
连接点(Join point):能够被拦截的地方
切点(Pointcut):处理的方法。即上面提到的showBookInfo方法
增强/通知(advice):添加到切点的处理。上面提到的Before, After, AfterReturning, AfterThrowing
织入(Weaving):将增强/通知添加到具体类的切点的过程
切面(Aspect):有切点和增强/通知组成
BookService.java
public interface BookService {
public void showBookInfo(Book book);
}
BookServiceImpl.java
@Service
public class BookServiceImpl implements BookService {
@Override
public void showBookInfo(Book book) {
if (book == null) {
throw new RuntimeException("null object");
}
System.out.print("Bookid:"+ book.getID());
System.out.print("/t BookName:" + book.getName());
System.out.println("/t Author:" + book.getAuthor());
}
}
showBookInfo就是我们的切点
BookServiceAspect.java
@Aspect
public class BookServiceAspect {
@Pointcut("execution(* com.springboot.aop.test.service.BookServiceImpl.showBookInfo(..))")
public void pointCut() {
}
@Before("pointCut()")
public void before() {
System.out.println("-------before.........");
}
@Around("pointCut()")
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("-------around before.........");
pjp.proceed();
System.out.println("-------around after.........");
}
@After("pointCut()")
public void after() {
System.out.println("-------after.........");
}
@AfterReturning("pointCut()")
public void afterReturning() {
System.out.println("-------afterReturning.........");
}
@AfterThrowing("pointCut()")
public void afterThrowing() {
System.out.println("-------afterThrowing.........");
}
}
对增强/通知添加了对应的处理
BookAOPController.java
@RestController
@RequestMapping("/book")
public class BookAOPController {
@Autowired
private BookService bookService = null;
@ResponseBody
@GetMapping("/showbookinfo")
public Book showBookInfo(@RequestParam String bookID, @RequestParam String bookName, @RequestParam String author) {
Book book = null;
if (bookID != null) {
book = new Book();
book.setID(bookID);
book.setName(bookName);
book.setAuthor(author);
}
bookService.showBookInfo(book);
return book;
}
}
SpringbookAopApplication.java
@SpringBootApplication
public class SpringbootAopApplication {
@Bean(name="bkServiceAspect")
public BookServiceAspect initAspect() {
return new BookServiceAspect();
}
public static void main(String[] args) {
SpringApplication.run(SpringbootAopApplication.class, args);
}
}
测试
可以看到我们的切点对应的增强/通知中的处理都执行了
示例代码在 SpringbootAOP