zoukankan      html  css  js  c++  java
  • aop+自定义注解

    自定义注解,并且实现,需要两个文件;

    自定义注解类:

    package com.clc.server.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(value = {ElementType.TYPE, ElementType.METHOD})//使用位置(类,方法)
    @Retention(RetentionPolicy.RUNTIME)//加载到jvm里运行
    public @interface Clc {
        String value(); //注解的属性,如果只有一个属性,一般叫value
        String name() default ""; //属性,默认值"",可以不写
    }

    定义好注解后,需要解析类来实现,此处使用aop来实现;

    package com.clc.server.aop;
    
    import com.clc.server.annotation.Clc;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    import java.lang.reflect.Method;
    
    /**
     * 解析clc注解使用
     */
    @Aspect//来定义一个切面
    @Component
    public class ClcAop {
    
        //定义切入点
        @Pointcut("@annotation(com.clc.server.annotation.Clc)")
        public void auditAspect() {
            System.out.println("1221212132");
        }
    
        //通知
        @Before("auditAspect()")
        public void doBefore(JoinPoint joinPoint) {
            System.out.println("触发到 @Before("auditAspect()")");
        }
    
        /**
         * 后置通知
         *
         * @param joinPoint 切点
         */
        @AfterReturning("auditAspect()")
        public void doAfrterReturning(JoinPoint joinPoint) {
    
            Object[] args = joinPoint.getArgs();
            System.out.println("触发 @AfterReturning("auditAspect()")");
            System.out.println(args.length);
            getControllerMethodDescription(joinPoint);
        }
    
        /**
         * 获取注解中对方法的描述信息
         *
         * @param joinPoint 切点
         * @return 方法描述
         */
        public static void getControllerMethodDescription(JoinPoint joinPoint) {
            String targetName = joinPoint.getTarget().getClass().getName();    //获得执行方法的类名
            String methodName = joinPoint.getSignature().getName();            //获得执行方法的方法名
            Object[] arguments = joinPoint.getArgs();                          //获取切点方法的所有参数类型
            try {
                Class targetClass = Class.forName(targetName);
    
                Method[] methods = targetClass.getMethods();    //获取公共方法,不包括类私有的
                String value = "";
                String name = "";
                for (Method method : methods) {
                    if (method.getName().equals(methodName)) {
                        Class[] clazzs = method.getParameterTypes();     //对比方法中参数的个数
                        if (clazzs.length == arguments.length) {
                            value = method.getAnnotation(Clc.class).value();
                            name = method.getAnnotation(Clc.class).name();
                            break;
                        }
                    }
                }
                System.out.println("value=" + value);
                System.out.println("name=" + name);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    测试注解,使用

       /**
         * 测试自定义注解
         */
        @Clc(value = "clc", name = "name")
        @RequestMapping(value = "/add2", method = RequestMethod.GET)
        public String add2() {
            //获取本服务的信息
            ServiceInstance instance = client.getLocalServiceInstance();
            Integer r = 2;
            String info = "/add, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + "结果:" + r;
            logger.info(info);
            return info;
        }

    触发注解后:

    2018-09-13 20:11:07.487  INFO 14012 --- [nio-9003-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
    2018-09-13 20:11:07.487  INFO 14012 --- [nio-9003-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
    2018-09-13 20:11:07.514  INFO 14012 --- [nio-9003-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 27 ms
    触发到 @Before("auditAspect()")
    2018-09-13 20:11:07.554  INFO 14012 --- [nio-9003-exec-1] c.c.s.c.ComputeController@7fcff1b9       : /add, host:localhost, service_id:clc-service结果:2
    触发 @AfterReturning("auditAspect()")
    0
    value=clc
    name=name
    2018-09-13 20:15:44.844  INFO 14012 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration

    简单的自定义注解,已经实现

  • 相关阅读:
    Ubuntu双系统
    Qt实现 动态化遍历二叉树(前中后层次遍历)
    Qt学习资料
    Qt学习--信号与槽(多窗口的实现)
    Qt 学习-----helloword
    二叉树的前中后层次遍历
    悬浮在网页右侧并可依次展开的菜单导航
    js实现仿华为手机计算器,兼容电脑和手机屏幕
    jquery json实现面向对象 百度十二星座
    knova绘制进度条
  • 原文地址:https://www.cnblogs.com/chenglc/p/9642891.html
Copyright © 2011-2022 走看看