上一篇 <<<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常用注解汇总