Spring AOP的底层原理

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-02-12 08:44 被阅读0次

    上一篇 <<<SpringBean单例情况下解决循环依赖的原理
    下一篇 >>>Spring AOP通知责任链模式图解


    什么是SpringAop

    Aop面向切面编程,在方法之前和之后实现处理
    实现原理:底层使用代理设计模式,在方法前后处理事情,以便代码复用,以及和业务解耦
    应用场景:日志记录,性能统计,安全控制(权限),参数验证,事务处理,异常处理等等。

    概念:
    切面: 关注点形成的类,就叫切面(类)!
    切入点: 执行目标对象方法,动态植入切面代码。

    Aop底层是如何实现

    动态代理技术,综合运用两种代理模式
    基于Jdk实现InvocationHandler 底层使用反射技术
    基于CGLIB实现 字节码技术

    SpringAop中如何运用cglib和jdk动态代理的

    创建代理时,如果有接口则执行jdk动态代理,否则执行cglib动态代理。

    SpringAOP如何对被代理实现增强的

    利用@EnableAspectJAutoProxy注解,实际上是把AnnotationAwareAspectJAutoProxyCreator.class注入到容器中,它其实是BeanPostProcessor的子类,在bean生命周期中的后置处理器里判断切面类情况进行生成增强器,并利用动态代理机制生成代理类。

    AnnotationAwareAspectJAutoProxyCreator 作用是什么

    它是BeanPostProcessor的子类,本质其实就是对init方法实现增强。

    AOP的实现方式

    1.注解版本AOP实现

    @Aspect                         指定一个类为切面类       
    @Pointcut("execution(* com.itmayiedu.service.UserService.add(..))")  指定切入点表达式
    @Before("pointCut_()")              前置通知: 目标方法之前执行
    @After("pointCut_()")               后置通知:目标方法之后执行(始终执行)
    @AfterReturning("pointCut_()")       返回后通知: 执行方法结束前执行(异常不执行)
    @AfterThrowing("pointCut_()")           异常通知:  出现异常时候执行
    @Around("pointCut_()")              环绕通知: 环绕目标方法执行
    开启事物注解权限:
    xml:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>  
    SpringBoot:@EnableAspectJAutoProxy
    

    2.XML方式实现AOP

    <!-- 切面类 -->
    <bean id="aop" class="com.itmayiedu.aop2.AopLog2"></bean>
    <!-- Aop配置 -->
    <aop:config>
        <!-- 定义一个切入点表达式: 拦截哪些方法 -->
        <aop:pointcut expression="execution(* com.itmayiedu.service.UserService.*(..))"
            id="pt" />
        <!-- 切面 -->
        <aop:aspect ref="aop">
            <!-- 环绕通知 -->
            <aop:around method="around" pointcut-ref="pt" />
            <!-- 前置通知: 在目标方法调用前执行 -->
            <aop:before method="begin" pointcut-ref="pt" />
            <!-- 后置通知: -->
            <aop:after method="after" pointcut-ref="pt" />
            <!-- 返回后通知 -->
            <aop:after-returning method="afterReturning"
                pointcut-ref="pt" />
            <!-- 异常通知 -->
            <aop:after-throwing method="afterThrowing"
                pointcut-ref="pt" />
        </aop:aspect>
    </aop:config>
    

    推荐阅读:
    <<<Spring IOC的初始化原理
    <<<SpringBean的生命周期流程图
    <<<SpringBean单例情况下解决循环依赖的原理
    <<<Spring AOP通知责任链模式图解
    <<<Spring AOP核心源码解读
    <<<Spring事务常识汇总
    <<<Spring声明事务原理及核心源码分析
    <<<手动事务和自定义注解事务代码参考
    <<<Spring常用注解汇总

    相关文章

      网友评论

        本文标题:Spring AOP的底层原理

        本文链接:https://www.haomeiwen.com/subject/wufqxltx.html