springAOP定义一个切面,切入日志

什么是springAOP

AOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AoP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低提高程序的可重用性同时提高了开发的效率

定义切面切入日志

首先介绍一下aop中execution 表达式

切入点表达式:execution(* 包名..(…))
整个表达式可以分为五个部分
1、execution(): 表达式主体。
2、第一个*号:方法返回类型, 第一个*号表示所有的类型
3、包名:表示需要拦截的包名
4、第二个号:表示*类名,号表示所有的类
5、
(…):最后这个*星号表示方法名,号表示所有的方法,后面( )里面表示方法的参数,两个句点表示任何参数
其中除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。

定义日志类接收日志信息

编写一个类,包含{ url;访问源ip;调用方法;传入参数;返回的页面名 }

@Data
@AllArgsConstructor
public class Content {

	private String url;
	private String ip;
	private String method;
	private Object[] args;
}

定义切面类

@Aspect
@Component
public class LogConfig {

	private Logger logger= LoggerFactory.getLogger(this.getClass());


	/**切入点*/
	@Pointcut("execution(* com.ruoyi.auth.controller.*.*(..))")
	public void log(){

	}

	@Before("log()")
	public void beforeLog(JoinPoint joinPoint){
		//传入的是切面对象,即出发这个AOP时被调用的那个方法,以获取所需要的"调用方法"以及"传入参数"
		ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();

		String url=request.getRequestURL().toString();
		String ip=request.getRemoteAddr();

		String method=
				joinPoint.getSignature().getDeclaringTypeName()
						+"."+
						joinPoint.getSignature().getClass();

		Object[] args=joinPoint.getArgs();

		Content content = new Content(url,ip,method,args);
		logger.info("Request:{}",content);
	}

	@AfterReturning(returning = "result", pointcut = "log()")
	public void logAfterReturning(Object result){
		logger.info("Result:{}",result);
	}

效果
在这里插入图片描述

你可能感兴趣的:(spring部分内容,java,spring)