SpringAOP 源码深度剖析,先教看源码的方法,然后给出流程图,根据方法和流程图去看,这里会将重点总结出来

一、手写Spring

篇幅限制,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122625811

二、Spring IoC高级应用和源码

篇幅限制,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122647693

三、Spring AOP 高级应用

篇幅限制,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122858872

四、SpringAOP 源码

读源码的准备工作
  1. 切面和通知
    在这里插入图片描述
  2. 配置类,将切面类加载
    在这里插入图片描述
  3. 测试类,打断点的地方
    在这里插入图片描述
看一下,当需要AOP横切逻辑增强的bean加载完成,是否已经成为代理对象(AOP就是动态代理实现的,所以要给它增强,必须成为代理对象)
  1. 一个小技巧,假设我想特别关注某一个内容,比如单例池,我就找到它,然后向上一拖,就会显示到debug中,就不用每次去找了
    在这里插入图片描述
    请添加图片描述

1. 重要关注时机点

通过上面分析,我们发现一个需要代理的bean初始化完成,就已经是代理对象了,所以生成代理对象的步骤肯定在bean创建生命周期过程中
  1. 前面Spring IoC源码讲解已经介绍的很清楚了,Bean初始化先是进入refresh()方法,而实例化是refresh()中调用finishBeanFactoryInitialization()方法完成的,这个里面处理bean的创建(循环依赖解决),并执行后置处理器(生成动态代理对象)
  2. 也就是说,我们关注后置处理器如何完成动态代理对象的创建
声明式事务,主要看注解做了什么
  1. @EnableTransactionManagement,开启事务注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
	boolean proxyTargetClass() default false;
	AdviceMode mode() default AdviceMode.PROXY;
	int order() default Ordered.LOWEST_PRECEDENCE;
}
  1. @Transactional注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
	@AliasFor("transactionManager")
	String value() default "";
	@AliasFor("value")
	String transactionManager() default "";
	Propagation propagation() default Propagation.REQUIRED;
	Isolation isolation() default Isolation.DEFAULT;
	int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
	boolean readOnly() default false;
	Class<? extends Throwable>[] rollbackFor() default {};
	String[] rollbackForClassName() default {};
	Class<? extends Throwable>[] noRollbackFor() default {};
	String[] noRollbackForClassName() default {};

}

2. 代理对象创建流程

流程图

请添加图片描述

3. Spring 声明式事务

3.1 @EnableTransactionManagement注解

在这里插入图片描述

@EnableTransactionManagement,使用@Import引入了一个类(TransactionManagementConfigurationSelector.class)
  1. 此类继承AdviceModeImportSelector抽象类,抽象类继承ImportSelector接口,这个接口有一个方法selectImports,需要实现
    在这里插入图片描述
  2. TransactionManagementConfigurationSelector当然就得实现这个方法,根据我们的配置,选择加载(引入)的类
    在这里插入图片描述
  3. 当我们参数是PROXY,就会引入AutoProxyRegistrar和ProxyTransactionManagementConfiguration类
3.1.1 AutoProxyRegistrar类
AutoProxyRegistrar类,实现ImportBeanDefinitionRegistrar接口,重写了registerBeanDefinitions方法,根据需要,根据导入的给定注释元数据注册bean定义
  1. 我们发现这个注册bean的方法引用了AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
    在这里插入图片描述
  2. 看一下AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);做了什么
    在这里插入图片描述
  3. 发现它注册了InfrastructureAdvisorAutoProxyCreator这个类,而这个类继承AbstractAdvisorAutoProxyCreator,这个类,我们上面代理对象创建流程里看过,是一个后置处理器,所以InfrastructureAdvisorAutoProxyCreator就是一个后置处理器
    在这里插入图片描述
  1. 就是下面这个流程图做的事,createProxy这一步把委托对象的aop增强和通用拦截合并,最终给代理对象
    在这里插入图片描述
3.1.2 ProxyTransactionManagementConfiguration类
进入这个类看看,发现是一个@Configuration配置类,注册了三个bean,事务增强器,属性解析器,事务拦截器,而事务增强器注入了两个属性,分别是属性解析器和事务拦截器

在这里插入图片描述
在这里插入图片描述

属性解析器AnnotationTransactionAttributeSource,我们看一下属性解析器这个类
  1. 发现这个类中有一个解析器集合Set< TransactionAnnotationParser> annotationParsers,我们看看集合存的TransactionAnnotationParser是什么
    在这里插入图片描述
  2. TransactionAnnotationParser是个接口,他有3个实现类,我们主要看SpringTransactionAnnotationParser
    在这里插入图片描述
  3. SpringTransactionAnnotationParser,就是解析事务细节的,说白了就是解析@Transactional注解属性的
    在这里插入图片描述
事务拦截器TransactionInterceptor实现MethodInterceptor接口(方法拦截接口)
  1. invoke方法用来触发原有业务逻辑调用,主要通过invokeWithinTransaction来完成
    在这里插入图片描述
  2. invokeWithinTransaction方法
    在这里插入图片描述
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring AOP流程图如下: 1. 首先,通过Spring的环境配置将AOP功能添加到应用程序中。 2. 当应用程序执行时,Spring框架在背后为每个被代理的bean创建一个代理对象。 3. 当调用被代理对象的方法时,Spring框架首先检查是否有与该方法相关联的通知。 4. 如果有相关联的通知,Spring框架方法的不同执行点将通知织入到方法中。 5. 通知可以在方法执行之前、之后或异常发生时执行,以实现横切关注点的功能。 6. 一旦通知被织入到方法中,Spring框架继续执行方法的原始逻辑。 7. 在方法执行完成后,Spring框架可以执行其他相关的通知,例如返回通知或异常通知。 8. 最后,Spring框架将最终的结果返回给调用方。 总结来说,Spring AOP的流程是将通知织入到被代理对象的方法中,以实现在方法执行前、执行后或异常发生时执行特定操作的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring事务的底层实现流程图](https://download.csdn.net/download/weixin_43860634/88136159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Spring ----> aop初识与 切面编程 实现方式(八)](https://blog.csdn.net/weixin_46163590/article/details/116348840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Spring AOP执行流程图&源码分析](https://blog.csdn.net/lbh199466/article/details/111395360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值