记一次学习Spring-Aop笔记

  • /**
         * 切面类要标注这两个注解交给spring管理bean 
         *@Aspect
         *@Component
         * 告诉spring每个方法在什么时候执行
         * @Before 在目标方法执行执行                   前置通知
         * @After 在目标方法执行之后执行                 后置通知
         * @AfterReturning 在目标方法正常返回之后执行     返回通知
         * @AfterThrowing 在目标方法抛出异常后执行        异常通知
         * @Around 环绕                                环绕通知
         */
    

      

  • 注解参数:"execution(public 返回值类型 类路径.方法名(参数类型...)"
        例子:
         @Before("execution(public int com.jbmei.stady.imp.MathImp.*(int,int))")
        解释:在MathImp类下面的所有返回值为int的方法,且参数列表为(int,int)的所有方法在执行之前都会执行该方法。
    通配符:
        * 一个或多个 
        .. 任意参数数量和类型
        1. 指定路径下所有类的所有方法:execution(*.包路径*.*(..))
    

      

  • 如何使用注解实现aop:
        首先创建一个注解,
        package com.jbmei.plugin.annotation;
    ​
        @Target(ElementType.METHOD)  // 方法上使用
        @Retention(RetentionPolicy.RUNTIME)// 运行时起作用
        public @interface GroupStatus{
        
        }
        然后在切面类中定义一个切点:
         /**
         * 定义切点,当所有交给spring管理的bean的方法上面发现这个注解(@GroupStatus)就会切入。
         */
        @Pointcut("@annotation(com.jbmei.plugin.annotation.GroupStatus)")
        public void privilege() {
    ​
        }
        
        然后直接使用spring的注解标注的方法
            /**
            *环绕通知
            */
        @Around("privilege()")// 这里只需要写上切点的方法名就行。
        public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint){
             //下面是一些常用功能。
            MethodSignature methodSignature = 
            (MethodSignature)proceedingJoinPoint.getSignature();// 获取方法签名
            String name = methodSignature.getName();// 获取方法名
            Class clazz=proceedingJoinPoint.getThis().getClass();// 获取类路径
            Object[] args=proceedingJoinPoint.getArgs();// 获取方法的参数列表
            return proceedingJoinPoint.proceed(); // 运行目标方法
        }
        /**
        import org.aspectj.lang.JoinPoint;
        import org.aspectj.lang.ProceedingJoinPoint;
        JoinPoint 和 ProceedingJoinPoint方法类似。
        */
        /**
        *后置通知
        */
        @After("privilege()")
        public void afterMethod(JoinPoint joinPoint){
            
        }
    

      

  • 中文简要Api

  • AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,
        使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。
        任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。
        我们先来了解一下这两个接口的主要方法: 
    1)JoinPoint 
     java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 
     Signature getSignature() :获取连接点的方法签名对象; 
     java.lang.Object getTarget() :获取连接点所在的目标对象; 
     java.lang.Object getThis() :获取代理对象本身; 
    2)ProceedingJoinPoint 
    ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 
     java.lang.Object proceed() throws java.lang.Throwable:
        通过反射执行目标对象的连接点处的方法; 
     java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:
        通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。
     
    

      

 posted on 2020-03-04 13:53  梅仙森  阅读(148)  评论(0)    收藏  举报