自定义注解之前有介绍过,用到的为AOP拦截,同一处理,什么是AOP ,拦截是为了是什么?
按我个人的理解,就是对某一个类,或者某一个方法的动态增强,何为增强呢。比如,之前说的自定义注解,本身这个方法是不具备校验参数的能力的,但是通过注解的添加,那么这个方法就有了校验参数的能力。这是再进入方法之前,不仅如此,我们还可以在方法之后,在做一些实情,比如之后,添加日志。
这样做的好处就是不用每个方法都要写相同的代码,如参数校验,日志存储可以统一在拦截之后作为处理。
拦截是为了增强,某个类,某个方法。
除了之前的文章自定义注解,还有对一些类的拦截,如:
@Aspect
@Component
public class ParamCheckContoller implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Pointcut("execution(* com.example.test.Controller.*(..))")
public void checkParam() {
}
@Before(value = "checkParam()")
public void before(JoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
System.out.println(method);
Object[] args = joinPoint.getArgs();
String[] parameterNames = new DefaultParameterNameDiscoverer().getParameterNames(method);
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
System.out.println(parameterNames[i]);
}
}
com.example.test.Controller 这个为一个控制器
@Pointcut("execution(* com.example.test.Controller.*(..))")
第一个* 为任何类型的返回都拦截
第二个* 为该类或者报下的都有类 都拦截
(..) 为该类中的所有类型的入参 都拦截
下面粘贴下调用的方法以及结果
@RequestMapping("/query/{name}")
public Object query(@PathVariable(name = "name") String name) {
areaService.kajf(name);
}
启动项目:然后请求 http://localhost:8081//query/你好
控制台打印信息
image.png
拦截到了请求参数。具体代码在test中
https://gitee.com/flgitee/test