美文网首页
aop之@Around

aop之@Around

作者: xiari1991 | 来源:发表于2020-12-04 09:44 被阅读0次

    1、切面类加上注解

    @Aspect //标注增强处理类(切面类)
    @Component //交由Spring容器管理
    

    2、给需要增强的方法添加切面
    方式一:在切面类中使用execution给批量方法添加切面

        @Around(value = "execution(* com.rq.aop.controller..*.*(..))")
        public void processAuthority (ProceedingJoinPoint point)throws Throwable{
        
        方法执行前的逻辑...
    
        //执行方法
        point.proceed();
    
       方法执行后的逻辑(在这里可以拿到方法返回的结果)...
        }
    

    注:execution的使用

    • 任意公共方法的执行:execution(public * *(..))
    • 任何一个以“set”开始的方法的执行:execution(* set*(..))
    • AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
    • 定义在service包里的任意方法的执行: execution(* com.xyz.service..(..))
    • 定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service...(..))

    方式二:自定义annotation注解

    自定义注解类
    package com.rq.aop.common.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)//运行时有效
    @Target(ElementType.METHOD)//作用于方法
    public @interface MyAnnotation {
        String methodName () default "";
    }
    
    给controller某个方法添加注解
    package com.rq.aop.controller;
    
    import com.rq.aop.common.annotation.MyAnnotation;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/hello")
    public class HelloController {
    
        @RequestMapping("/login/{name}")
        @MyAnnotation(methodName = "login")
        public void login(@PathVariable String name){
            System.out.println("hello!"+name);
        }
    }
    
        //切面类中定义增强,pointcut连接点使用@annotation(xxx)进行定义
        @Around(value = "@annotation(around)") //around 与 下面参数名around对应
        public void processAuthority(ProceedingJoinPoint point,MyAnnotation around) throws Throwable{
            System.out.println("ANNOTATION welcome");
            System.out.println("ANNOTATION 调用方法:"+ around.methodName());
            System.out.println("ANNOTATION 调用类:" + point.getSignature().getDeclaringTypeName());
            System.out.println("ANNOTATION 调用类名" + point.getSignature().getDeclaringType().getSimpleName());
            point.proceed(); //调用目标方法
            System.out.println("ANNOTATION login success");
        }
    

    相关文章

      网友评论

          本文标题:aop之@Around

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