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 ");
    }
}

 

posted @ 2020-07-15 21:25  陈彦斌  阅读(383)  评论(0编辑  收藏  举报