zoukankan      html  css  js  c++  java
  • 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 ");
        }
    }
  • 相关阅读:
    重启进程
    linux如何查看端口被哪个进程占用?
    Web服务器磁盘满深入解析及解决
    基于Nginx实现访问控制、连接限制
    Tomcat线程模型分析及源码解读
    linux防火墙使用以及配置
    MySQL死锁及解决方案
    tcpdump 命令
    netperf 网络性能测试
    netstat 命令详解
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13308228.html
Copyright © 2011-2022 走看看