• Spring AOP注解


    声明切面类

      @Aspect(切面):通常是一个类,里面可以定义切入点和通知

    配置切入点和通知

    LogAdvice.java

    package net.cybclass.sp.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    //能被扫描
    @Component
    //告诉Spring,这是一个切面类,里面可以定义切入点和通知
    @Aspect
    public class LogAdvice {
        //切入点表达式
        @Pointcut("execution(* net.cybclass.sp.servicce.VideoServiceImpl.*(..))")
        public void aspect(){
    
        }
        //前置通知
        @Before("aspect()")
        public void beforeLog(JoinPoint joinPoint) {
            System.out.println("LogAdvice beforeLog 被调用了");
        }
        //后置通知
        @Before("aspect()")
        public void afterLog(JoinPoint joinPoint) {
            System.out.println("LogAdvice afterLog 被调用了");
        }
    }

    开启Spring AOP注解配置

    package net.cybclass.sp.aop;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.stereotype.Component;
    //告诉Spring,这个类可以被扫描
    @Component
    //扫描包
    @ComponentScan("net.cybclass")
    @EnableAspectJAutoProxy //开启了spring对aspect的支持
    public class AnnotationConfig {
    }

    VideoService.java

    package net.cybclass.sp.servicce;
    
    import net.cybclass.sp.domain.Video;
    
    public interface VideoService {
        int save(Video video);
        Video findById(int id);
    }

    VideoServiceImpl.java

    package net.cybclass.sp.servicce;
    
    import net.cybclass.sp.domain.Video;
    import org.springframework.stereotype.Component;
    
    //@Component("videoService") //相当于配置bean的id
    @Component() //相当于配置bean的id
    public class VideoServiceImpl implements VideoService{
        public int save(Video video) {
            System.out.println("保存Video");
            return 0;
        }
    
        public Video findById(int id) {
            System.out.println("根据id找视频");
            return new Video();
        }
    }

    演示

    环绕通知

    package net.cybclass.sp.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    //能被扫描
    @Component
    //告诉Spring,这是一个切面类,里面可以定义切入点和通知
    @Aspect
    public class LogAdvice {
        //切入点表达式
        @Pointcut("execution(* net.cybclass.sp.servicce.VideoServiceImpl.*(..))")
        public void aspect(){
    
        }
        //前置通知
        @Before("aspect()")
        public void beforeLog(JoinPoint joinPoint) {
            System.out.println("LogAdvice beforeLog 被调用了");
        }
        //后置通知
        @After("aspect()")
        public void afterLog(JoinPoint joinPoint) {
            System.out.println("LogAdvice afterLog 被调用了");
        }
        @Around("aspect()")
        public void around(JoinPoint joinPoint) throws Throwable {
            //获取目标类
            Object target=joinPoint.getTarget().getClass().getName();
            System.out.println("调用者:"+target);
            Object[] args=joinPoint.getArgs();
            System.out.println("参数:"+args[0]);
            Long start=System.currentTimeMillis();
            System.out.println("环绕通知 环绕前===========");
            //执行连接点的方法
            ((ProceedingJoinPoint)joinPoint).proceed();
            Long end=System.currentTimeMillis();
            System.out.println("环绕通知 环绕后===========");
            System.out.println("调用方法总耗时 time = "+(end-start)+" ms ");
        }
    }
  • 相关阅读:
    Python通过多线程实现 `异步`
    Linux(六) 处理用户输入
    Linux(五) 更多结构化命令
    Linux(四) 使用结构化命令
    Linux(三) 科学计算
    Linux(二) Shell脚本
    python 登陆接口
    学习的小建议
    干货
    ThinkPhp5 自定义异常处理类
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13308228.html
Copyright © 2020-2023  润新知