1、编写DataFilter注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataFilter {
public String deptAlias() default "";
public String userAlias() default "";
}
2、编写切面类
@Aspect
@Component
@Slf4j
public class DataFilterAspect {
public static final String DATA_FILTER = "dataFilter";
@Before("@annotation(controllerDataScope)")
public void doBefore(JoinPoint point, DataFilter controllerDataScope) throws Throwable {
clearDataScope(point);
handleDataScope(point, controllerDataScope);
}
protected void handleDataScope(final JoinPoint joinPoint, DataFilter controllerDataFilter) {
...
}
private void clearDataScope(final JoinPoint joinPoint) {
Object params = joinPoint.getArgs()[0];
if (StringUtils.isNotNull(params) && params instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) params;
baseEntity.getParams().put(DATA_SCOPE, "");
}
}
}
- @Aspect 用于表示该类为切面类
controllerDataScope
:切面方法是通过 @annotation(controllerDataScope)
切入点表达式来匹配那些被 DataFilter
注解标记的方法- 切入点注解
- @Before:切面切入目标方法之前执行
- @After:目标方法执行之后执行,它通常用于执行一些清理或日志记录操作
- @Around:切面方法中调用
ProceedingJoinPoint
的proceed
方法,即调用目标方法,最灵活的方式,可以用于性能监测、事务管理等复杂场景 - @AfterReturning
- @AfterThrowing
- 是否return
- 需要return:如果在切面方法中使用
joinPoint.proceed()
来调用目标方法,并获取返回值,然后根据需要对返回值进行修改或处理 - 不需要return:不打算修改返回值,可以不包含
return
语句