AOP 简单介绍
AOP , Aspect Oriented Programming
AOP 是一种编程范式,面向切面编程。面向对象编程,主要是按照业务封装成类。AOP 将通用逻辑从业务逻辑中分离出来,形成单独的模块。
适用场景
- 如登陆之后才能进行某些操作
- 打印日志
常见的 AOP 注解
| 注解名称 | 作用 |
|---|---|
Before |
在运行之前 |
After |
在运行之后 |
Pointcut |
注解一个方法 |
AfterReturn(returning = "obj", pointcut = "log()") |
记录程序的返回值 |
对所有访问进行拦截,记录日志
新建 aspect/HttpAspect
@Aspect
@Component
public class HttpAspect{
// 对 BookController 中所有的请求都进行拦截记录
//@Before("execution(public * com.zzjack.zzjackweb3.controller.BookController.*(..))")
// 拦截其中一个方法
@Before("execution(public * com.zzjack.zzjack.zzjackweb3.controller.BookController.bookEntityList(..))")
public void log(){
System.out.println(1111111);
}
}
使用 @After对方法执行之后进行拦截
@Aspect
@Component
public class HttpAspect{
@After("execution(public * com.zzjack.zzjackweb3.controller.BookController.*(..))")
public void doAfter(){
System.out.println(22222);
}
}
用 @Pointcut 进行改造
目的是减少重复代码
@Aspect
@Component
public class HttpAspect{
@Pointcut("execution(public * com.zzjack.zzjackweb3.controller.BookController.*(..))")
public void log(){}
@Before("log()")
public void doBefore(){
System.out.println(1111)
}
}
使用日志
// 注意选择 slf4j 来记录日志
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
@Before("log()")
public void doBefore(){
logger.info("111111");
}
日志中记录一些关键信息
- 返回之前,记录 args/method/ip/类方法
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// url
logger.info("url={}",request.getRequestURL());
//method
logger.info("method={}", request.getMethod());
//ip
logger.info("ip={}",request.getRemoteAddr);
//类方法
logger.info("class method = {}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// 参数
logger.info("args={}", joinPoint.getArgs());
}
- 返回之后,记录返回信息
@AfterReturning(returning = "obj", pointcut = "log()")
public void afterReturning(Object obj){
logger.info("returning = {}", obj.toString());
}
这时候运行,看到日志中只能看到返回了一个对象,想要让他们返回 字符串还需要在 BookEntity 中重写toString()的方法。
alt + insert, 选择 `toString()`,自动生成 `toString()` 的代码。