文章目录
一、手写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 源码
读源码的准备工作 |
---|
- 切面和通知
- 配置类,将切面类加载
- 测试类,打断点的地方
看一下,当需要AOP横切逻辑增强的bean加载完成,是否已经成为代理对象(AOP就是动态代理实现的,所以要给它增强,必须成为代理对象) |
---|
- 一个小技巧,假设我想特别关注某一个内容,比如单例池,我就找到它,然后向上一拖,就会显示到debug中,就不用每次去找了
1. 重要关注时机点
通过上面分析,我们发现一个需要代理的bean初始化完成,就已经是代理对象了,所以生成代理对象的步骤肯定在bean创建生命周期过程中 |
---|
- 前面Spring IoC源码讲解已经介绍的很清楚了,Bean初始化先是进入refresh()方法,而实例化是refresh()中调用finishBeanFactoryInitialization()方法完成的,这个里面处理bean的创建(循环依赖解决),并执行后置处理器(生成动态代理对象)
- 也就是说,我们
关注后置处理器如何完成动态代理对象的创建
声明式事务,主要看注解做了什么 |
---|
- @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;
}
- @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) |
---|
- 此类继承AdviceModeImportSelector抽象类,抽象类继承ImportSelector接口,这个接口有一个方法selectImports,需要实现
- TransactionManagementConfigurationSelector当然就得实现这个方法,根据我们的配置,选择加载(引入)的类
- 当我们参数是PROXY,就会引入AutoProxyRegistrar和ProxyTransactionManagementConfiguration类
3.1.1 AutoProxyRegistrar类
AutoProxyRegistrar类,实现ImportBeanDefinitionRegistrar接口,重写了registerBeanDefinitions方法,根据需要,根据导入的给定注释元数据注册bean定义 |
---|
- 我们发现这个注册bean的方法引用了AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
- 看一下AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);做了什么
- 发现它注册了InfrastructureAdvisorAutoProxyCreator这个类,而这个类继承AbstractAdvisorAutoProxyCreator,这个类,我们上面代理对象创建流程里看过,是一个后置处理器,所以
InfrastructureAdvisorAutoProxyCreator就是一个后置处理器
- 就是下面这个流程图做的事,createProxy这一步把委托对象的aop增强和通用拦截合并,最终给代理对象
3.1.2 ProxyTransactionManagementConfiguration类
进入这个类看看,发现是一个@Configuration配置类,注册了三个bean,事务增强器,属性解析器,事务拦截器,而事务增强器注入了两个属性,分别是属性解析器和事务拦截器 |
---|
属性解析器AnnotationTransactionAttributeSource,我们看一下属性解析器这个类 |
---|
- 发现这个类中有一个解析器集合Set< TransactionAnnotationParser> annotationParsers,我们看看集合存的TransactionAnnotationParser是什么
- TransactionAnnotationParser是个接口,他有3个实现类,我们主要看SpringTransactionAnnotationParser
- SpringTransactionAnnotationParser,就是解析事务细节的,说白了就是解析@Transactional注解属性的
事务拦截器TransactionInterceptor实现MethodInterceptor接口(方法拦截接口) |
---|
- invoke方法用来触发原有业务逻辑调用,主要通过invokeWithinTransaction来完成
- invokeWithinTransaction方法