zoukankan      html  css  js  c++  java
  • spring aop 基础1

    作用:增强方法

    本例基于 反射+注解+aspect

    流程

      1:创建注解(标识哪个方法使用aop,也可以直接使用表达式)  

      2:创建切面

      3:创建方法,使用注解标记

    1:创建注解

    /**
     * 标记**方法使用 WebAspect 切面
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)     //作用与方法
    public @interface WebAnnotation {
    
    
    }

    2:创建切面

    @Aspect
    @Component
    public class WebAspect {
    
        /**
         * 定义切点
         */
        @Pointcut(value = "@annotation(com.draymond.aop2.annotation.WebAnnotation)")
        private void pointCut() {
        }
    
        @Before(value = "pointCut()")
        public void before(JoinPoint point) {                                   //  execution(void com.draymond.aop2.service.UserService.findById(int))
            System.out.println(" WebAspect before ");
            String kind = point.getKind();                                      //  method-execution 获取连接点的类型
            Object[] args = point.getArgs();                                    //  [1] 参数的值
            Object target = point.getTarget();
            Class<?> clazz = target.getClass();                                 //  class com.draymond.aop2.service.UserService
            MethodSignature signature = (MethodSignature) point.getSignature();
            String signatureName = signature.getName();                         //  findById
            Class declaringType = signature.getDeclaringType();                 //  class com.draymond.aop2.service.UserService
            String declaringTypeName = signature.getDeclaringTypeName();        //  com.draymond.aop2.service.UserService
            String[] parameterNames = signature.getParameterNames();            //  [i] 参数名称
            Class[] parameterTypes = signature.getParameterTypes();             //  [int]
            Method method = signature.getMethod();                              //  public void com.draymond.aop2.service.UserService.findById(int)
            Class returnType = signature.getReturnType();                       //  void
    
            int modifiers = signature.getModifiers();                           // 1
    
            SourceLocation sourceLocation = point.getSourceLocation();          //  execution(void com.draymond.aop2.service.UserService.findById(int))
            JoinPoint.StaticPart staticPart = point.getStaticPart();            //  execution(void com.draymond.aop2.service.UserService.findById(int))
            Object aThis = point.getThis();                                     //  com.draymond.aop2.service.UserService@d90ec19
            String s = point.toLongString();                                    // execution(public void com.draymond.aop2.service.UserService.findById(int))
            String s1 = point.toShortString();                                  // execution(UserService.findById(..))
            String s2 = point.toString();                                       // execution(void com.draymond.aop2.service.UserService.findById(int))
    
    
            System.out.println("-----------------");
            Map<String, Object> map = new HashMap<>();
            for (int i = 0; i < parameterNames.length; i++) {
                map.put(parameterNames[i], args[i]);                            //  {"int":1}   获取到方法的参数,以及对应的值
            }
    
            System.out.println(JsonUtils.toStringNoEx(map));
    
        }

    3:创建方法,使用注解标记

    @Service
    public class UserService {
        @WebAnnotation
        public void findById(int i) {
            System.out.println("执行了 UserService 的 findById 方法 ");
        }
    }

    4:controller中调用该方法,再请求接口

    补充:通知类型

        before

        after

        afterThrowing

        afterReturn

        around

      参数:jointPoint  ProceedingJoinPoint   

                 

      

  • 相关阅读:
    每天玩转3分钟 MyBatis-Plus
    每天玩转3分钟 MyBatis-Plus
    每天玩转3分钟 MyBatis-Plus
    git仓库管理
    【SpringCloud之pigx框架学习之路 】2.部署环境
    【SpringCloud之pigx框架学习之路 】1.基础环境安装
    Ubuntu 14.04 安装mysql
    Netflix是什么,与Spring Cloud有什么关系
    现学现用-我的第三个小小小私活
    申请微信小游戏账号
  • 原文地址:https://www.cnblogs.com/draymond/p/12664685.html
Copyright © 2011-2022 走看看