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();
    }
}

  

代码示例中,可以将以下概念与代码相对应:

  1. 切点(Pointcut):切点是一组方法的集合,用于指定在何处应用切面逻辑。在代码中,pageOrder() 方法使用 @Pointcut 注解定义了一个切点,表示匹配特定方法的执行。

  2. 切面(Aspect):切面是包含切入点和通知的类。在代码中,PageOrderAspect 类被标记为切面,通过 @Aspect 注解进行声明。

  3. 引入(Introduction):引入允许向现有类添加新方法或属性。在给定的代码示例中,并没有涉及到引入的概念。

  4. 织入(Weaving):织入是将切面应用到目标对象并创建代理对象的过程。在给定的代码示例中,织入是通过 @Around 注解和 doAround() 方法实现的。@Around 注解将切面逻辑织入到目标方法的执行前后。

  5. 通知(Advice):通知是切面在特定连接点执行的代码。在给定的代码示例中,doAround() 方法使用 @Around 注解作为环绕通知,该通知包裹了目标方法,并在其执行前后进行额外操作。

综上所述,在给定的代码示例中,切点对应 pageOrder() 方法,切面对应 PageOrderAspect 类,织入和通知则由 doAround() 方法实现。至于引入,则在该代码示例中没有涉及到。

posted @ 2024-02-07 15:04  消失的那两年  阅读(71)  评论(0编辑  收藏  举报