Spring AOP学习笔记

Springboot 实现AOP

其实搞明白AOP是什么之后(基于动态代理实现面向切面编程的一种思想),无论在哪里使用都很简单,但是由于最近做的好多项目都使用springboot,所以就在补充一下,超级无敌简单

依赖的包,pom中引入即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

springboot实现AOP有两种方式:一是申明的方式(基于XML),二是注解的方式(基于AspectJ),由于个人喜好只说说注解的方式实现AOP,

一、实现方式一(编写切入点表达式)

@Service
public class LogService {
    private final Logger logger = LoggerFactory.getLogger(LogService.class);

    public void search(){
        logger.info("查询方法被执行");
    }
}

@Aspect
@Component
public class LogAspect {
    private final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    
    @Pointcut("execution(public * com.dafeng.service.LogService.*(..))")//切入点描述 这个是切入点
    public void logPointcut(){}//签名,可以理解成这个切入点的一个名称

    @Before("logPointcut()") //在切入点的方法执行之前
    public void before(JoinPoint joinPoint) {
        logger.info("方法执行前。。。");
    }

    @After("logPointcut()") //在切入点的方法执行之后
    public void after(JoinPoint joinPoint) {
        logger.info("方法执行后。。。");
    }
}

执行结果:

2020-03-01 13:40:38.894  INFO 35973 --- [nio-8080-exec-1] com.dafeng.service.LogAspect             : 方法执行前。。。
2020-03-01 13:40:38.903  INFO 35973 --- [nio-8080-exec-1] com.dafeng.service.LogService            : 查询方法被执行
2020-03-01 13:40:38.903  INFO 35973 --- [nio-8080-exec-1] com.dafeng.service.LogAspect             : 方法执行后。。。

二、 实现方式二(自定义注解)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
}

@Service
public class LogService {
    private final Logger logger = LoggerFactory.getLogger(LogService.class);

    @Log // 此处添加自定义注解
    public void search(){
        logger.info("查询方法被执行");
    }
}

@Aspect
@Component
public class LogAspect {
    private final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    
    @Pointcut("@annotation(com.dafeng.annotation.Log)")//切入点描述使用自定义注解 这个是切入点
    public void logPointcut(){}//签名,可以理解成这个切入点的一个名称

    
    @Before("logPointcut()") //在切入点的方法执行之前要干的
    public void before(JoinPoint joinPoint) {
        logger.info("方法执行前。。。");
    }

    @After("logPointcut()") //在切入点的方法执行之后要干的
    public void after(JoinPoint joinPoint) {
        logger.info("方法执行后。。。");
    }
}

执行结果:

2020-03-01 14:12:35.434  INFO 40304 --- [nio-8080-exec-1] com.dafeng.service.LogAspect             : 方法执行前。。。
2020-03-01 14:12:35.441  INFO 40304 --- [nio-8080-exec-1] com.dafeng.service.LogService            : 查询方法被执行
2020-03-01 14:12:35.442  INFO 40304 --- [nio-8080-exec-1] com.dafeng.service.LogAspect             : 方法执行后。。。
posted @ 2020-03-01 14:34  _dafeng  阅读(207)  评论(0编辑  收藏  举报