zoukankan      html  css  js  c++  java
  • aspectj 与 spring 自定义注解

    **
     * ErrorCode:
     *
     * @author yangzhenlong
     * @since 2016/7/21
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface ErrorException {
        int code() default 0;//参数
    }
    复制代码
    Aspect拦截注解类
    
    复制代码
    /**
     * ErrorExceptionAspect:
     *
     * @author yangzhenlong
     * @since 2016/7/21
     */
    @Component
    @Aspect
    public class ErrorExceptionAspect {
    
        //@Before("execution(* com.sarkuya.service..*.*(..))")
        @Pointcut(value = "@annotation(com.mlxs.mvc.anno.ErrorException)")
        private void pointcut() {
        }
    
        @Around(value = "pointcut() && @annotation(errorExecption)")
        public Object around(ProceedingJoinPoint point, ErrorException errorExecption){
            System.out.println("---->around");
            //注解参数
            System.out.println("注解参数:"+ errorExecption.code());
            //当前拦截的类和方法:
            Class clazz = point.getTarget().getClass();
            Method method = ((MethodSignature) point.getSignature()).getMethod();
    
            String codeName = clazz.getSimpleName()+"_"+method.getName();
            System.out.println("query param---->"+codeName);
    
            //方法返回结果
            Object result = null;
            Object args = Arrays.asList(point.getArgs());
            try {
                //执行方法(可以在方法前后添加前置和后置通知)
                result = point.proceed();
                //校验结果
                result = validateResult(result);
            } catch (Throwable e) {
                //记录日志
                System.out.println(codeName + "()方法异常:" + e);
                //打印堆栈信息
                e.printStackTrace();
                //设置返回信息
                result = "结果:抛了异常了。。-----------------------"+e.getMessage()+",原因:"+e.getCause();
            }
            //返回通知
            return result;
    
        }
    
        /**
         * 方法执行后
         * @param joinPoint
         * @param result
         */
        @AfterReturning(value = "pointcut() && @annotation(errorExecption)", returning = "result")
        public Object afterReturning(JoinPoint joinPoint, ErrorException errorExecption,  Object result){
            System.out.println("---->afterReturning");
            String methodName = joinPoint.getSignature().getName();
            System.out.println("The method " + methodName + " return with " + result);
            if(result instanceof Boolean){
                if(!((Boolean) result)){
                    result = "error----result is false";
                }
            }else{
                if(result == null){
                    result = "error----result is null";
                }
            }
            return result;
        }
        /**
         * 方法执行后
         * @param joinPoint
         * @param ex
         */
        @AfterThrowing(value = "pointcut() && @annotation(errorExecption)", throwing = "ex")
        public void afterThrowing(JoinPoint joinPoint, ErrorException errorExecption, Exception ex){
            System.out.println("eeeee--->afterThrowing");
            String methodName = joinPoint.getSignature().getName();
            System.out.println("The method " + methodName + "occurs exception: " + ex);
        }
    
        private Object validateResult(Object result){
            if(result instanceof Boolean){
                if(!((Boolean) result)){
                    System.out.println("error----result is false");
                    result = "error:false";
                }
            }else{
                if(result == null){
                    System.out.println("error----result is null");
                    result = "error:null";
                }
            }
            return result;
        }
    }
    复制代码
    测试:
    
    复制代码
    /**
     * _Test:
     *
     * @author yangzhenlong
     * @since 2016/7/21
     */
    @Component("test")
    public class _Test {
    
        public static void main(String[] args) {
            ApplicationContext context =
                    new ClassPathXmlApplicationContext("classpath*:spring/applicationContext.xml");
            _Test obj = (_Test) context.getBean("test");
            System.out.println("==========>"+obj.test());
            //System.out.println("==========>"+obj.test2());
        }
    
        @ErrorException(code = 100)
        public Object test(){
            System.out.println("---test---");
            int a = 10/0;
            return 20;
        }
    
        @ErrorException(code = 22)
        public Object test2(){
            System.out.println("---test2---");
            //int a = 10/0;
            return false;
        }
    
    }
  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/whm-blog/p/7156469.html
Copyright © 2011-2022 走看看