RxJavaJava编程语言爱好者

Spring AOP的底层原理

2021-02-12  本文已影响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常用注解汇总

上一篇下一篇

猜你喜欢

热点阅读