spring aop切面理解

 aop的概念以及与oop的区别以及为什么要用,什么时候要用,百度上各种copy的文章一大堆,就不再抄了,记录一下自己的理解

——切面用于切入方法,获取方法的一些参数,并做自定义操作。

——类似oop,是一种编程思想,如拦截器,旨在特定(有共性)的方法后,做统一的事情,如统一日志记录等。

springboot整合第三方框架aspectj进行切面注解

pom.xml引入jar  spring-aop 和 aspectj

<!--spring aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

切面 TestAspect.java

package com.flysand.demo.aspect;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author flysand on 2019/07/16
 **/
@Aspect
@Component
public class TestAspect {
    @Pointcut("execution(* com.flysand.demo.controller.AopTestController.*(..))")
    public void pointCut(){}


    @Before("pointCut()")
    public void beforeMethod(JoinPoint joinPoint){
        // 执行方法前执行 2
        System.out.println("before pointcut");
        Object[] objects = joinPoint.getArgs();
        if (objects.length > 0) {
            for (Object object : objects) {
                System.out.println(object);
            }
        }

    }

    @Around("pointCut()")
    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 进入方法后最先执行 1
        System.out.println("before around method ");
        // 执行方法
        Object o = proceedingJoinPoint.proceed();
        // 执行方法后执行 3
        System.out.println("方法执行结果:" + JSON.toJSONString(o));
        System.out.println("after around method");
        return o;
    }


    @After("pointCut()")
    public void afterMethod(JoinPoint joinPoint) {
        // 方法执行完后执行  -- 不管是否抛异常,只要方法结束就执行  -- 必然执行 4
        System.out.println("after method");

    }

    @AfterReturning("pointCut()")
    public void afterReturning(){
        // 当方法有正常返回时执行  5
        System.out.println("after returning");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing(){
        // 当方法抛异常时执行  5
        System.out.println("after throwing");
    }
}

所有通知都可以创建相应的切入点pointcut,也可以创建一个公共的切入点,由其他通知分别调用

各种通知的执行顺序:其中 around、before、after为永远执行的通知方法,afterReturning为正常返回时执行,afterThrowing为异常返回时执行

原文地址:https://www.cnblogs.com/flysand/p/11193720.html