Spring Boot学习——AOP编程的简单实现
首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式。AOP的思想理念就是将通用逻辑从业务逻辑中分离出来。
本文将通过一个HTTP请求的例子简单的讲解Spring Boot中AOP的应用,步骤如下:
第一步,添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
第二步,创建AOP方法的类
package *; //自己定义 import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; 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; @Aspect @Component public class HttpAspect { //使用org.slf4j.Logger,这是Spring实现日志的方法 private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); /** * 定义AOP扫描路径 * 第一个注解只扫描aopTest方法 */ //@Pointcut("execution(public * com.aston.reader.controller.StudentController.aopTest())") @Pointcut("execution(public * com.aston.reader.controller.StudentController.*())") public void log(){} /** * 记录HTTP请求开始时的日志 */ @Before("log()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //URL logger.info("url={}", request.getRequestURI()); //method logger.info("method={}", request.getMethod()); //ip logger.info("ip={}",request.getRemoteAddr()); //类方法 logger.info("class={} and method name = {}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName()); //参数 logger.info("参数={}",joinPoint.getArgs()); } /** * 记录HTTP请求结束时的日志 */ @After("log()") public void doAfter(){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); logger.info("url = {} end of execution", request.getRequestURL()); } /** * 获取返回内容 * @param object */ @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturn(Object object){ logger.info("response={}",object.toString()); } }
第三步,创建试验方法
package *; //自己定义 import org.springframework.web.bind.annotation.*; @RestController public class StudentController { @GetMapping(value = "/aoptest") public String aopTest(){ return " AOP test success!"; } }
第四步,启动程序,访问 http://127.0.0.1:8080/aoptest 查看结果。