Spring 接点、切点、切面、引入、织入、通知 概念
import com.github.pagehelper.PageHelper; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.util.StringUtils; import java.util.Map; import java.util.regex.Pattern; /** * @author Sheeper * @date 2018/5/23. */ @Aspect @Configuration @Order(2) public class PageOrderAspect { public final static String PAGE = "page"; public final static String PAGE_NUM = "pageNum"; public final static String ORDER_KEY = "orderKey"; public final static String ORDER_MODEL = "orderModel"; public final static String PRIMARY_KEY = "primaryKey"; public final static Pattern pattern = Pattern.compile("^\\w+$"); @Pointcut("execution(* com.example.service..*.list*(..))") public void pageOrder() { } @Around("pageOrder()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { Object[] objects = joinPoint.getArgs(); if (objects.length == 1 && objects[0] instanceof Map) { Map<String, Object> params = (Map<String, Object>) objects[0]; if (params.containsKey(PAGE) && params.containsKey(PAGE_NUM)) { try { PageHelper.startPage(Integer.parseInt(params.get(PAGE).toString()) , Integer.parseInt(params.get(PAGE_NUM).toString())); } catch (Exception e) { //throw new ValidateException("com_page_parameters_error"); } } else { // throw new ValidateException("com_page_empty"); } if (params.containsKey(ORDER_KEY) && !StringUtils.isEmpty(params.get(ORDER_KEY)) && params.containsKey(ORDER_MODEL) && !StringUtils.isEmpty(params.get(ORDER_MODEL))) { if (!pattern.matcher(String.valueOf(params.get(ORDER_KEY))).matches()) { // throw new BusinessLogicException("request_param_error"); } if (!pattern.matcher(String.valueOf(params.get(ORDER_MODEL))).matches()) { // throw new BusinessLogicException("request_param_error"); } String orderBy = params.get(ORDER_KEY) + " " + params.get(ORDER_MODEL); if (params.containsKey(PRIMARY_KEY)) { orderBy = orderBy + ", " + params.get(PRIMARY_KEY); } PageHelper.orderBy(orderBy); } } return joinPoint.proceed(); } }
代码示例中,可以将以下概念与代码相对应:
-
切点(Pointcut):切点是一组方法的集合,用于指定在何处应用切面逻辑。在代码中,
pageOrder()
方法使用@Pointcut
注解定义了一个切点,表示匹配特定方法的执行。 -
切面(Aspect):切面是包含切入点和通知的类。在代码中,
PageOrderAspect
类被标记为切面,通过@Aspect
注解进行声明。 -
引入(Introduction):引入允许向现有类添加新方法或属性。在给定的代码示例中,并没有涉及到引入的概念。
-
织入(Weaving):织入是将切面应用到目标对象并创建代理对象的过程。在给定的代码示例中,织入是通过
@Around
注解和doAround()
方法实现的。@Around
注解将切面逻辑织入到目标方法的执行前后。 -
通知(Advice):通知是切面在特定连接点执行的代码。在给定的代码示例中,
doAround()
方法使用@Around
注解作为环绕通知,该通知包裹了目标方法,并在其执行前后进行额外操作。
综上所述,在给定的代码示例中,切点对应 pageOrder()
方法,切面对应 PageOrderAspect
类,织入和通知则由 doAround()
方法实现。至于引入,则在该代码示例中没有涉及到。
阳光总在风雨后!