AOP(为controller中的所有方法打印日志的功能)
面向切面的编程:在不修改原有代码的前提下,添加新的功能。
IoC和AOP是spring的基础
类/接口/方法 都支持AOP都是连接点
Joint point | 连接点 | 程序中支持AOP的位置 |
Pointcut | 切点 | 要增加功能的一组Joint point(连接点) |
Advice | 增强 | 要添加的新功能 |
Aspect | 切面 | 为切点添加的新功能(Pointcut+Advice) |
Target | 目标对象 | 具体的每一个Pointcut(切点) |
Weaving | 织入 | 在Target上增加Aspect(在每一个要增加功能的对象上增加功能) |
举例(再springboot中使用)
为controller中的所有方法打印日志的功能
1.引入依赖
<!--引入AOP场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.在 aop 包下创建 xxxAspect 类
1. 为类增加 @Aspect 和 @Component
2. 定义切点
3. 定义增强
package com.zhiyou100.zymusic.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @author zhangfan
* @date 2019/9/27
*/
@Aspect
@Component
public class WebLogAspect {
private static long beforetime = 0;
//定义打印日志类
private static final Logger log = LoggerFactory.getLogger(WebLogAspect.class);
/**定义的是切点
* 方法名就是切点名
* 使用execution表达式,定义切点为:controller包中的所有方法
* 第一个*:选中的连接点的方法返回值可以是任意类型,
* 如* 改为void意思为选中的连接点的方法返回值为void的类型
* 第二个*:选中的连接点的方法所在类可以是任意名字
* 第三个*:选中的连接点的方法名字可以是任意名字
* ..:表示任意参数
*/
@Pointcut("execution(public * com.zhiyou100.zymusic.controller.*.*(..))")
public void webLog(){
}
/**
* 定义增强
* 在切点的什么位置增加新的功能
* @Before:方法执行前
* @After方法执行后
* @Around方法执行前+方法执行后
* @AfterThrowing:方法抛出异常后
* @AfterReturning:方法返回后
*/
@Before("webLog()")
public void doBefore(JoinPoint joinPoint){
//在controller层以外获取当前正在处理的请求,固定格式
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
String ip = request.getRemoteAddr();
String method = request.getMethod();
String URL = request.getRequestURI().toString();
String params = null;
if ("POST".equals(method) || "PUT".equals(method)) {
//joinPoint 就是targer
//获取target方法中的所有参数
//如果target = sendCode 那么args = params
//如果target = register 那么args = userParam
Object[] args = joinPoint.getArgs();
if (args.length > 0){
params = args[0].toString();
}
}
beforetime = System.currentTimeMillis();
//打印日志
log.info("\n\n\n{}\n\n\n{}\n\n\n{}\n\n\n{}\n\n\n",ip,method,URL,params);
}
@After("webLog()")
public void afterTime(){
long betweenTime = System.currentTimeMillis() - beforetime;
log.info("耗时:{}",betweenTime);
}
}
版权声明:本文为shilihuakai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。