众所周知,AOP是spring的重要思想,那么springboot怎么使用AOP呢?AOP的作用是什么?
AOP主要的思想就是切面编程,这种思想主要是想把我们的关注点统一提取出来统一管理。多的不说进入代码时刻
我用的是gradle版本管理工具,aop导入包
compile 'org.aspectj:aspectjtools:1.8.1'
然后我们先写一个控制层类,让aop来切这个类
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping(value = "/hello")
public class aopTestController {
@Autowired
private GirlService girlService;
@ResponseBody
@GetMapping(value = "/world")
public String aopTest(@RequestParam String name){
return "hello"+name;
}
}
然后再写一个aop类
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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 AopTest {
private static final Logger logger = Logger.getLogger(AopTest.class); //日志,我用的log4j
//配置切点
@Pointcut("execution(* com.sso.controller..*(..))")
public void log() {
}
@Before("log()") //前置通知
public void beforeExcution(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());
//port
logger.info("port:"+request.getRemotePort());
//类方法
logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//参数
logger.info("args:"+joinPoint.getArgs());
}
@AfterReturning(returning = "ret", pointcut = "log()") //后置返回
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
}
spring AOP的使用
1.我们先创建一个controller方法
2.其次我们还得导入aop的相关类
compile 'org.aspectj:aspectjtools:1.8.1'
3.然后我们需要认识几个aop的注解
@Aspect:这个注解告诉spring容器,我这个类是主要就是来做aop管理的,可能会横切某个方法,在运行方法之前先运行这个
被注解的方法。
@Component:组件,就是要将这个类当作组件放进spring容器中,在实例化对象的时候会将这个类当作组件实例化到spring容器中
要学习AOP还得知道几个关键点,切点,切入的时间
我们通常用@Pointcut来设置切点,切点可以是方法,类,参数,关键看自己想怎么切
切入时间大致分为一下几个时间点:
@Before
@Around
@After
@AfterReturning
...
这个具体的用法看aopTest中的应用
@AfterReturning 后置返回可以获取返回的结果
@AfterReturning(returning = "ret", pointcut = "log()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
之后我们还需要看一个第三方类,JoinPoint
这个对象可以获取很多请求的属性,具体看源码:参数,类方法....
到此,我们的aop运用就大致结束,具体还是要知道aop的特性来决定它的应用。
小demo的github地址私信QQ:1391086179