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() 方法实现。至于引入,则在该代码示例中没有涉及到。
阳光总在风雨后!

浙公网安备 33010602011771号