在后端开发中我们经常对数据进行分页操作,对于这种重复性操作我们可以对其进行封装使用,接下来我们利用aop+pagehelper实现一个自动分页的注解
1.添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 分页注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AutoPage {
/**
* 默认 第一页
*/
int page() default 1;
/**
* 默认每页显示7条数据
*/
int size() default 7;
}
3.aop
import cn.hutool.core.convert.Convert;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@SuppressWarnings("all")
@Slf4j
@Aspect
@Component
public class AutoPageAspectj {
@Autowired
private HttpServletRequest req;
@Pointcut("@annotation(com.cwf.common.page.annotation.AutoPage)")
public void doPointcut() {
}
@Around("@annotation(myPage)")
public Object test(ProceedingJoinPoint point, AutoPage myPage) throws Throwable {
//开始分页
Integer page = Convert.toInt(req.getParameter("page"), myPage.page());
Integer size = Convert.toInt(req.getParameter("size"), myPage.size());
PageHelper.startPage(page, size);
Object[] args = point.getArgs();
Object result = point.proceed(args);
Object pageResult = pageResult(result);
return pageResult;
}
@After("doPointcut()")
public void after() {
log.info("清除分页线程");
PageHelper.clearPage();
}
/**
* 对分页结果处理
*
* @param result
*/
private Object pageResult(Object result) {
PageInfo pageInfo = null;
R r = null;
Object list = null;
if (result instanceof R) {
r = (R) result;
Object data = r.getData();
if (data instanceof List) {
list = data;
pageInfo = new PageInfo((List) data);
}
}
if (pageInfo != null) {
MyPageInfo<Object> format = PageUtils.format(pageInfo, (List<Object>) list);
R res = new R<>(r.getCode(), r.getMsg(), format);
return res;
} else {
return result;
}
}
}
4.使用
5.效果