# spring-framework **Repository Path**: wlizhi/spring-framework ## Basic Information - **Project Name**: spring-framework - **Description**: spring源码阅读,版本5.1.3.RELEASE。源码中添加了详细的中文注释。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: v5.1.3.RELEASE - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 31 - **Forks**: 30 - **Created**: 2020-10-16 - **Last Updated**: 2025-02-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Framework intensive reading ## 说明 spring源码阅读,理解spring各个模块的实现原理,实现流程。源码中添加了大量的中文注释(关键模块都有,很详细)。 ## Spring源码版本 v5.1.3RELEASE ## 源码下载及编译 1. 源码下载:`git clone --branch v5.1.3.RELEASE https://gitee.com/wanglizhi00/spring-framework.git` 2. 源码编译: 到下载的spring源码路径执行gradle命令 .\gradlew :spring-oxm:compileTestJava 3. 使用IDEA打开项目后,如果在IDEA中使用gradle重新编译模块乱码,添加以下JVM参数
-Dfile.encoding=UTF-8 ## 源码引入到maven项目library中 ## ## ## 核心功能概览(源码中大量详细中文注释) 1. spring上下文初始化核心流程(refresh方法) 1.prepareRefresh(); refresh之前的准备工作,内部调用逻辑已注释 2.obtainFreshBeanFactory();BeanFactory创建,XMl文件解析,BeanDefinition封装 1.SPi(Service Provider Interface)思想,注册解析类 2.NamespaceHandler init() decorate() parse() 处理默认及自定义标签解析 3.BeanDefinitionParser,由NamespaceHandler.init()注册,负责标签属性解析 1.PropertyPlaceholderBeanDefinitionParser 2.PropertyOverrideBeanDefinitionParser 3.AnnotationConfigBeanDefinitionParser 4.ComponentScanBeanDefinitionParser 重点关注 5.SpringConfiguredBeanDefinitionParser ... 4.委托模式 5.源码中类似路径正则解析的建议不看,调用链太深,容易陷进去出不来。 3.prepareBeanFactory(beanFactory);注册一些对事件、监听器等内置功能的支持 4.postProcessBeanFactory(beanFactory);BeanFactory创建后,自定义操作。 5.invokeBeanFactoryPostProcessors(beanFactory); 重点方法:这里调用了postProcessBeanDefinitionRegistry(registry)、 postProcessBeanFactory(registry);springboot中很多自动配置的注解通过这里导入 重点关注:AnnotationConfigUtils.registerAnnotationConfigProcessors, 注册的内置的BeanDefinitionRegistryPostProcess 1.ConfigurationClassPostProcessor,内部包含@Configuration、 @Bean、@Import、@ImportSource、@Component、@ComponentScan、 @PropertySources等注解的支持 6.registerBeanPostProcessors(beanFactory);从beanFactory中获取所有的 BeanPostProcessor,优先进行getBean操作,实例化。 接口及子接口 BeanPostProcess 定义了类初始化之前、之后的方法回调 InstantiationAwareBeanPostProcessor 定义了类实例化之前、之后、 依赖注入的方法回调 SmartInstantiationAwareBeanPostProcessor定义了获取早期 Bean引用、获取候选构造函数方法 重点关注: RequiredAnnotationBeanPostProcessor AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor MergedBeanDefinitionPostProcessor bean实例化之后依赖注入之前方法回调 DestructionAwareBeanPostProcessor 定义了bean销毁之前的方法回调 InitDestroyAnnotationBeanPostProcessor 7.initMessageSource();国际化支持,不常用,未加注释。 8.initApplicationEventMulticaster();初始化ApplicationEventMulticaster 如果上下文中未定义,则使用SimpleApplicationEventMulticaster。 9.onRefresh();钩子方法,springBoot中的嵌入式tomcat就是通过此方法实现的 10.registerListeners();监听器注册 11.finishBeanFactoryInitialization(beanFactory);重点方法:完成容器中bean的 实例化及代理的生成等操作。这里面包含内容getBean、依赖注入、生成代理等。 12.finishRefresh();完成此上下文的刷新,调用LifecycleProcessor的onRefresh 方法并发布 2. bean实例化流程 所有单例bean实例化后回调接口SmartInitializingSingleton。Bean实例化流程: getBean -> doGetBean -> getSingleton() -> getSingleton -> singletonFactory.getObject() -> createBean -> resolveBeforeInstantiation 给机会返回代理 -> applyBeanPostProcessorsBeforeInstantiation -> applyBeanPostProcessorsAfterInitialization -> doCreateBean -> createBeanInstance -> applyMergedBeanDefinitionPostProcessors -> addSingletonFactory -> populateBean依赖注入 -> postProcessProperties 属性注入 spring5.1版本及之后 -> findAutowiringMetadata封装需要注入的属性 -> inject -> element.inject(InjectedElement) -> (AutowiredFieldElement/AutowiredMethodElement) -> postProcessPropertyValues属性注入spring5.1版本之前 -> applyPropertyValues -> initializeBean -> applyBeanPostProcessorsBeforeInitialization -> invokeInitMethods -> applyBeanPostProcessorsAfterInitializationAOP入口 ->addSingleton()添加一级缓存 -> getObjectForBeanInstance 如果实力是FactoryBean类型,调用factory.getObject();最终返回这个方法返回的实例. 如果要获取源实例,需要在beanName前加&符号 3. BeanPostProcessor扩展 --> AOP实现流程 1.AOP的生成: -> AbstractAutoProxyCreator.postProcessAfterInitialization -> wrapIfNecessary -> getAdvicesAndAdvisorsForBean 获取切面 -> findEligibleAdvisors -> findCandidateAdvisors -> super.findCandidateAdvisors() -> findAdvisorBeans -> buildAspectJAdvisors -> isAspect -> getAdvisors -> getAdvisorMethods -> getAdvisor -> getPointcut -> new InstantiationModelAwarePointcutAdvisorImpl -> createProxy -> buildAdvisors 构建切面(将是MethodInterceptor的对象 包装为Advisor,策略模式,消除执行链时的ifelse) —> resolveInterceptorNames(事务增强会在这里面) -> getProxy生成代理对象 -> createAopProxy (JdkDynamicAopProxy/ObjenesisCglibAopProxy) -> getProxy -> if(JdkDynamicAopProxy) -> Proxy.newProxyInstance -> if(ObjenesisCglibAopProxy) -> createProxyClassAndInstance -> newInstance ->setCallbacks 2.AOP执行链的执行(以JDK动态代理为例): JdkDynamicAopProxy.invoke -> getInterceptorsAndDynamicInterceptionAdvice -> invocation = new ReflectiveMethodInvocation -> invocation.proceed() -> currentInterceptorIndex未达到执行链末尾 -> 获取切面是InterceptorAndDynamicMethodMatcher -> dm.interceptor.invoke(this);执行切面增强, 并将自身作为参数传递,火炬传递。比如around中会议JoinPoint为参数, 内部调用时又会调用到proceed方法 -> currentInterceptorIndex达到执行链末尾 -> invokeJoinpoint -> 有火炬传递的,向上跳出,执行后置增强并返回。 4. BeanPostProcessor扩展 --> 事务实现代码流程 1.入口:EnableTransactionManagement -> @Import(TransactionManagementConfigurationSelector.class) -> ProxyTransactionManagementConfiguration -> 包含一系列的@Bean标识的方法,其中transactionAdvisor 返回对应BeanFactoryTransactionAttributeSourceAdvisor, 这个类是事务增强类。 2.事务属性搜集:getTransactionAttribute -> computeTransactionAttribute -> findTransactionAttribute -> determineTransactionAttribute -> parseTransactionAnnotation -> 查找Transactional注解 -> parseTransactionAnnotation -> AnnotationAttributes转换为TransactionAttribute 3.事务拦截器执行流程:TransactionInterceptor,getBean中AOP生成代理对象时, 会将这个方法拦截器加入执行链中 invoke -> invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed(这个是执行链的回调函数)) -> determineTransactionManager -> createTransactionIfNecessary -> getTransaction -> isExistingTransaction -> handleExistingTransaction -> definition.getPropagationBehavior() ==reauired、requiredNew、nested -> doBegin -> prepareTransactionInfo -> proceedWithInvocation -> (completeTransactionAfterThrowing -> cleanupTransactionInfo) /(cleanupTransactionInfo -> commitTransactionAfterReturning) 事务的执行流程不好描述,具体可看源码中的注释,很详细。 5. MVC中DispatcherServlet核心流程:HanlderMapping、HanlderAdapter扩展等。