spring AOP详解

介绍:
    什么是AOP?
        AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程。

        场景:案例中部分业务方法运行较慢,定位执行耗时较长的接口,此时需要统计每一个业务方法的执行耗时。

        优点:
            减少重复代码
            代码无侵入
            提高开发效率
            维护方便

AOP基础:
    AOP快速入门:
        引入依赖:
                org.springframework.boot    spring-boot-starter-aop

        编写aop程序:
            @Slf4j
//@Aspect   // 表示当前类就是aop类
//@Component
public class TimeAspect {

    @Around("execution(* com.sde.service.impl.DeptServiceImpl.*(..))")
    public Object recordTime(ProceedingJoinPoint point) throws Throwable {
        //获取调用执行时间
        long begin = System.currentTimeMillis();

        //调用原始方法执行
        Object result = point.proceed();

        //获取调用方法结束时间

        long end = System.currentTimeMillis();

        //数据日志
        log.info("执行方法耗时{}ms",end - begin);

        //返回原始方法执行的结果
        return result;
    }
}
    AOP核心概念:
        连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息
        通知:Advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)

        切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
        切面:Aspect,描述通知与切入点的对应关系(通知+切入点)

        目标对象:Target,通知所应用的对象


AOP进阶:
    通知类型:
        @Arround:环绕通知,此注解标注的地方在目标方法前,后都会被执行。
        @Before:前置通知,此注解标注的通知方法在目标方法前被执行。
        @After:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都被执行。
        @AfterReturning:返回后通知,此注解标注的通知方法在目标发方法后被执行,有异常不会执行。
        @AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行。
    通知顺序:
        当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。

        执行顺序:
            不同切面类,默认按照切面类的类名字母排序:
                目标方法前在通知方法:字母排名靠前先执行。
                目标方法后的通知方法:字母排名靠前的后执行。
            用@Order(数字)加在切面类上来控制顺序:
                目标方法前的通知方法:数字小的先执行

                目标方法后的通知方法:数字小的后执行

    切入点表达式:
        介绍:
            描述切入点方法的一种表达式。
        作用:
            用来决定项目中的哪些方法需要加入通知
        常见形式:
            execution(……):根据方法的签名来匹配

            @annotation(……) :根据注解匹配

        execution:主要根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配。
            execution(访问修饰符?  返回值  包名.类名.?方法名(方法参数) throws 异常?)

            可以使用通配符描述切入点:
                其中带 ?的表示可以省略的部分。
                    1,访问修饰符:可以省略(比如:public,protected)
                    2,包名:可省略
                    3,throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)

                * :单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分

                ..  多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

                根据业务需要,可以使用 且(&&)、或(||)、非(!) 来组合比较复杂的切入点表达式
        @annotation
            子主题 1
    连接点:

AOP案例:
 

你可能感兴趣的:(java技术成才之路,spring,java,spring,boot)