自定义注解之前有介绍过,用到的为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/你好

控制台打印信息




自定义注解思考_spring boot


image.png


拦截到了请求参数。具体代码在test中

https://gitee.com/flgitee/test