美文网首页
java自定义注解

java自定义注解

作者: SUNOW2 | 来源:发表于2018-11-05 15:25 被阅读5次

    1、定义注解

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface Validate {
        String url() default "";
    
        enum type{GET, POST, DELETE};
    
        String[] method() default {};
    }
    

    2、使用注解

    @RestController
    @RequestMapping(value = "/index")
    public class IndexController {
        
        @GetMapping()
        @Validate
        public String index() {
            return "index";
        }
    }
    

    3、提供切面对注解数据进行操作

    /**
     * 描述:@annotation:标注了某个注解的所有方法
     * execution(* com.software.*.*(..))
     * 第一个*代表任意的的修饰符和返回值,第二个*代表任意的类,第三个*代表类的任意方法,最后一个..匹配任意数量的参数
     *
     * 1、@Before:前置通知,在方法执行之前执行的通知
     * 2、@After:后置通知,在方法执行之后执行,即方法返回结果或者抛出异常的时候
     * 3、@AfterRunning:返回通知,在方法返回结果之后执行(ps:无论方法是正常返回,还是抛出异常,后置通知都会执行,如果
     * 只想在方法返回的时候执行,应使用返回通知代替后置通知)
     * 4、@AfterThrowing:异常通知,在方法抛出异常之后执行
     * 5、@Around:环绕通知,围绕着方法执行(即方法前后都有执行)
     *
     * @ClassName ValidateAspect
     * @Author 徐旭
     * @Date 2018/11/5 15:06
     * @Version 1.0
     */
    @Aspect
    @Component
    public class ValidateAspect {
    
        /**
         * 切入点,表示拦截的切入点方法,注解在方法级别之上,但是不执行方法体,只表示切入点的入口
         */
        @Pointcut(value = "@annotation(com.example.annotation.annotation.Validate)")
        public void pointcut() {
        }
    
        /**
         * 方法执行前后
         * @param point
         * @param validate
         * @return
         */
        @Around(value = "pointcut() && @annotation(validate)")
        public Object around(ProceedingJoinPoint point, Validate validate) {
            String url = validate.url();
            
            Class clazz = point.getTarget().getClass();
            Method method = ((MethodSignature)point.getSignature()).getMethod();
            check(method, Validate.class);
            
            System.out.println("执行了类:" + clazz + "方法:" + method + " 请求地址:" + url);
    
            try {
                System.out.println(point.proceed());
                return point.proceed();
            } catch (Throwable throwable) {
                return throwable.getMessage();
            }
        }
    
        /**
         * 方法执行后,@AfterReturning的value指定所有带有@Validate注解的方法体为切点
         * @param point
         * @param validate
         * @param result
         * @return
         */
        @AfterReturning(value = "pointcut() && @annotation(validate)", returning = "result") 
        public Object afterReturning(JoinPoint point, Validate validate, Object result) {
            return result;
        }
    
        /**
         * 出现异常时执行
         * @param point
         * @param validate
         */
        @AfterThrowing(value = "pointcut() && @annotation(validate)")
        public void afterThrowing(JoinPoint point, Validate validate) {
            System.out.println("出现异常");
        }
    
        public static <T> boolean check(Method method, Class<T> annotation) {
                List<Annotation> list = Arrays.asList(method.getAnnotations());
        
                for (int i = 0; i < list.size(); i++) {
                    Annotation ann = list.get(i);
                    // 找到自己的注解
                    if (ann.annotationType().equals(annotation)) {
                        System.out.println("test");
                    }
                }
                return true;
            }
    }
    

    相关文章

      网友评论

          本文标题:java自定义注解

          本文链接:https://www.haomeiwen.com/subject/zuesxqtx.html