假如咱们须要作一个功能——受权访问,即对全部的方法的访问以前须要判断用户是否登录,只有登录的用户才能够访问方法。对于这个情景,若是选择在每个方法内加上用户登陆判断,那么就会形成大量的代码冗余,由此引出AOP的使用。java
使用AOP(面向切面编程),咱们能够把判断用户是否登录做为一个切面,插入到每个方法执行的各个位置。web
这里,咱们以记录请求日志为例子,记录下SpringBoot中AOP的使用:spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>1.5.6.RELEASE</version> </dependency>
(chrome中右键选“在新标签中打开图片”便可查看大图)chrome
源码以下:编程
package com.example.demo.aspect; 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 { private static final Logger logger= LoggerFactory.getLogger(HttpAspect.class); @Pointcut("execution(public * com.example.demo.controller.StudentController.*(..))") public void log(){} @Before("log()") public void doBefore(JoinPoint joinPoint){ //url ServletRequestAttributes attributes= (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request=attributes.getRequest(); 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()); } @After("log()") public void doAfter(){ logger.info("2222222222222"); } @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ logger.info("response={}",object); } }