简介
AOP切面编程在项目中常用的技术,log管理,分页操作,公共业务处理,都有很好的应用,下面以用AOP简单实现 mybatis分页的功能
创建自定义注解
@Target({ ElementType.METHOD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface PageTools {
String value() default "";
}
aop 切面代码 ,mybatis分页逻辑处理
@Aspect
@Component
@Slf4j
public class PageToolsAop {
//@Pointcut("execution(* net.bingosoft.bmsa.ninthdesign.service..*.*(..))") //包名方式做切点
@Pointcut("@annotation(net.bingosoft.bmsa.common.annotation.PageTools)")
public void requestPointcut() {
}
@Around("requestPointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
if (request.getParameter("pageNum") != null && request.getParameter("pageSize") != null) {
Integer pageNum = Integer.valueOf(request.getParameter("pageNum"));
Integer pageSize = Integer.valueOf(request.getParameter("pageSize"));
if(request.getParameter("orderBy")!=null) {
String orderBy = String.valueOf(request.getParameter("orderBy"));
PageHelper.startPage(pageNum, pageSize, orderBy);
}else {
PageHelper.startPage(pageNum, pageSize);
}
}
log.info("PageToolsAop:Around1#######");
Object obj = joinPoint.proceed();
log.info("PageToolsAop:Around2#######");
return obj;
}
//声明前置通知
@Before("requestPointcut()")
public void doBefore(JoinPoint point) {
log.info("PageToolsAop:doBefore#######");
return;
}
//声明后置通知
@AfterReturning(pointcut = "requestPointcut()", returning = "returnValue")
public void doAfterReturning(JoinPoint point,Object returnValue) {
log.info("PageToolsAop:doAfterReturning#######");
}
//声明例外通知
@AfterThrowing(pointcut = "requestPointcut()", throwing = "e")
public void doAfterThrowing(Exception e) {
log.info("PageToolsAop:doAfterThrowing#######");
}
//声明最终通知
@After("requestPointcut()")
public void doAfter() {
log.info("PageToolsAop:doAfter#######");
}
}
注解切点,业务代码
@PageTools //在分页查询SQL切入aop
public List<Dto> listPage(QueryVo vo) {
System.out.println("====");
return mapper.listPage(vo);;
}
发送请求 ,分页信息
逻辑输出,可以看出aop通知的执行顺序
Execute SQL:SELECT * FROM shift_type WHERE ORDER BY create_time DESC LIMIT 20;
2020-12-16 09:23:48.942 INFO net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:Around1#######
2020-12-16 09:23:52.405 INFO net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:doBefore#######
====
2020-12-16 09:23:54.981 INFO net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:doAfterReturning#######
2020-12-16 09:23:58.993 INFO net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:doAfter#######
2020-12-16 09:24:00.224 INFO net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:Around2#######