spring-framework核心链路全景图V0.1(持续更新,小白慎入)
2021-05-19 17:57:14 0 举报
关于spring-framework源码,业界一直没有一个完整的链路流程全景图来供阅读学习spring-framework源码的爱好者来参考。基于这个目的,特梳理了spring-framework相关的流程链路图,来帮助开发者更好的读懂spring源码。此图是V0.1版本,仅包含spring ioc主要部分流程,后续版本会继续迭代关于spring-framework其他核心组件源码流程链路图,来不断完善此图。
作者其他创作
大纲/内容
applyMergedBeanDefinitionPostProcessors
⚙️
!=null
doCreateBean
11
会添加自定义的实现了ApplicationListener接口的类到集合中
initApplicationEventMulticaster
初始化后操作,会执行procssor的postProcessAfterInitialization方法
AbstractAutoProxyCreator.createProxy
8.1
Tips: 程序员可自定义bean类来实现BeanFactoryProcessor,这里就会将这样的bean注册到beanPostProcessor中
返回bean为空
没有获取到advisor
2.3
向beanPostProcessor中添加自定义的PostProcessor处理器
beanFactoryPostProcessor
自动装配选择构造函数逻辑:如果只有一个构造函数,那么则通过这个构造函数进行实例化;如果有多个构造函数,那么首先会将构造方法排序,排序规则:参数多的优先,然后具体使用哪个,是根据权重来判断的,通过取出参数的每一个类型,如果不存在该类,则直接放弃该构造方法,如果一个构造方法的参数类型存在父类,另一个构造方法参数类型不存在父类,那么不存在父类的权重高,最终会使用权重高的构造方法进行实例化
7
通过反射对属性进行赋值
1
spring-framework核心链路全景图V0.1
- beanExpressionResolver : StandarBeanExpressionResolver - beanPostProcessors :ApplicationContextAwareProcessorApplicationListenerDetector - ignoredDependencyInterfaces :EnvironmentAware.classEmbeddedValueResolverAware.classResourceLoaderAware.classApplicationEventPublisherAware.class MessageSourceAware.classApplicationContextAware.class - resolvableDependencies - singletonObjects:environment : StandarEnvironmentsystemProperties : ... ...systemEnvironment : ... ...主要是添加了2个后置处理器、将系统上下文环境添加到单例池中
getParentBeanFactory
applyBeanPostProcessorsBeforeInitialization
singletonObject中不存在这个bean
这是spring提供给开发者的又一个扩展点,开发者可以干预bean的生成过程,这里可以修改返回需要构造方法。
9
实例化
循环引用处理:会处理标有@Autowired @Value @Inject注解的属性和方法。根据之前存储到injectionMetadataCache中的InjectMetaDate,来获取循环引用的属性或者方法,从而进行属性填充。例如A中定义了B b属性,需要对A进行b属性的填充时,那么需要获取B类,所以需要调用getBean方法获取B类型的bean
7.2
这个提供给程序员一个扩展点,如果自定义了一个实现了SmartInstanceAwareBeanPostProcessor接口的bean,那么会干预判断FactoryBean
这里开发者可以自定义postProcessor,并实现postProcessAfterInitialization方法,来干预初始化前的执行逻辑。
处理注入点。即寻找bean中标有@Aurtowired、@Value、@Inject注解的属性及方法,封装成InjectionMetadata保存到injectionMetadataCache中
主要会发布注册到spring容器中的事件
applyBeanPostProcessorsAfterInitialization
返回一个代理对类
Tips:这里会处理实现了ApplicationListener接口的bean,如果是这个类型的bean,就放入到ApplicationListener中
获取到了advisor
doResolveDependency
14
prepareBeanFactory
postProcessAfterInstantiation
mergedBeanDefinitions
MergedBeanDefinitionPostProcessor类型的processor
autowireConstructor
singletonFactories.get(beanName)
registerLinsteners
wrapIfNecessary
populateBean
转换bean的名字,如果传入的是beanName,那么会去掉&
推断方法返回构造方法不为空
AnnotationConfigApplicationContext
向beanPostProcessor中添加PostProcessor处理器
解析出bd的class,通过db.getClass来获取,如果返回的类型不是class类型,那么就通ClassLoader.loadClass生成class
singletonFactory.getObect()
向单例池中添加DelegatingMessageSource
从bdMap中取出bd
resolveCandidate
register
beanDefinitionMaps
从beanDefinitionNames和mergedBeanDefinitions中取出BeanDefinitionRegistryPostProcessor类型的processor
BeanDefinitionReader
2.4
这里开发者可以自定义postProcessor,并实现postProcessBeforeInitialization方法,来干预初始化前的执行逻辑
通过构造方法来实例化bean,也就是custor.newInstance实例化
核心方法,主要执行bean的生命周期
检查是否已经在创建,如果是,则抛出异常
initializeBean
存在dependOn
getMergedLocalBeanDefinition
是singleton
getAdvicesAndAdvisorsForBean
ConfigurationClassPostProcessor.postProcesBeanDefinitionRegistry
createBean
将ImportAwareBeanPostProcessor加入beanFactoryPostProcessor
进行属性填充
7.3
判断是否存在父beanFactory,如果存在则从父beanFacotory中获取bean
transformedBeanName
开始bean的生命周期
实例化后,可以自定义InstantiationAwareBeanPostProcessor接口,并重写postProcessAfterInstantiation方法,这个方法返回false,就会干预属性填充,及不会执行以下流程
resolveBeanClass
createBeanInstation
从容器中取出beanFactoryPostProcessor
这个方法只是设置了一些启动标示、记录了启动时间
beanDefinitionNames
obtainFreshBeanFactory
初始化
执行其余的后置处理器的postProcessBeanFactory方法
invokeInitMethods
遍历bdNames,取出所有beanName
2
1. 将包含@Configuration注解的类,重新包装成Enhancer对象重新放入bd的beanClass中;2.向beanFactoryPostProcessor中添加 后置处理器
findAutowiringMetadata
8
initMessageSource
如果从singletonObject中取出bean,那么直接返回
ClassPathXmlApplicationContext
getBean/doGetBean
如果从earlySingletonObjects中取出bean,那么直接返回
如果是抽象或非单例或懒加载的,就不执行getBean
未从三级缓存中取出
12
beanPostProcessor
实例化前,首先执行InstantiationAwareBeanPostProcessor类型的beanPostProcessor的postProcessBeforeInstantiation方法,如果返回值不为空,那么就会执行beanPostProcessor的postProcessAfterInitialization方法。如果最终返回不为空,那么直接返回这个bean,不在执行spring生成bean的过程
addSingletonFactory传入一个lamda表达式,将这个lamda表达式getEarlyBeanReference方法写入singletonFactories(三级缓存)
onRefresh
getSingleton
buildAutowiringMetadata
首先从一级缓存中获取bean
finishBeanFactoryInitialization
inject
根据bdName从bdMap中取出RootBeanDefinition(rbd)
prepareRefresh
封装InjectMetaData核心方法,思想就是获得bean中包含@Autowired、@Value、@Inject注解的属性和方法,将其封装成InjectMetaData返回
3
向applicationListenerBeans添加监听器
0
getDependOn
推断构造方法返回空
向单例池中添加SimpleApplicationEventMulticaster
此处进行aop代理类初始化,生成一个代理类
判断取出的rdb是不是非抽象的、单例的、非懒加载的,如果满足条件还需判断是否是FactoryBean
- reader - classLoader - beanFactoryPostProcessors - applicationListeners - beanFactory - singletonObjects - singletonFactories - earlySingletonObjects - registeredSingletons - singletonsCurrentlyInCreation - dependentBeanMap - dependenciesForBeanMap - factoryBeanObjectCache - beanPostProcessors - mergedBeanDefinitions - ignoredDependencyTypes - ignoredDependencyInterfaces - beanDefinitionMap - beanDefinitionNames - manualSingletonNames - environment - dependencyComparator: AnnotationAwareOrderComparator - autowireCandidateResolver : ContextAnnotationAutowireCandidateResolver - beanExpressionResolver - resolvableDependencies- scanner - registry - beanNameGenerator - includeFilters
这是spring提供给开发者的又一个扩展点,开发者可以干预bean的生成过程,可以对bean进行修改
13
标示当前bean正在被创建
postProcessMergedBeanDefinition
先执行依赖bean的生命周期
instantiateBean
6
第一个参数是beanName,第二个参数是createBean方法
10
earlySingletonObjects.get(beanName)
通过reader读取传入的扫描配置类
registerBeanPostProcessor
getBean
会处理传入的扫描配置类,扫描包下所有包含@Component(MangedBean)、@Configuration、@Import和注有@Bean的方法,会将它们的类及其子类,将其包装成bd存储到bdMaps和bdNames中,也会处理@Import注解的类的相关方法
postProcessPropertyValues
获取或创建bean,bean的生命周期起点
instantiate
提前暴露的主要条件:是否是单例bean
7.1
取出当前bean依赖(dependOn)的bean
执行推断构造方法,从beanPostProcessor中取出SmartInstatitionAwareBeanPostProcessor类型的processor,执行其determineCandidateConstructors方法
resolveBeforeInstantiation
Tips: Import注解的类,需实现了ImpertSelector或ImportBeanDefinitionRegistar才会执行相关的方法
markBeanCAsreated
主要处理循环引用问题
- beanDefinitionMap - beanDefinitionNames 会向上面两个集合中add传入的扫描配置类,也就是通过AnnotationConfigApplicationContext传入的自定义的扫描配置类,此时beanDefinitionMap和beanDefinitionNames中就会分别存储传入扫描配置类的名称和名称与beanDefinition(beanDefinition封装了扫描配置类)
determineConstructorsFromBeanPostProcessors
返回bean
beforeSingletonCreation
isFactoryBean
分别从singletonObject(一级缓存)中获取,取不到则会去earlySingletonObject(二级缓存)中去获取,如果还取不到,则会从三级缓存中获取,然后执行getObect方法生成bean。但是一级缓存取不到,从二级或三级缓存中获取的条件是当前bean是正在创建的,否则也不会从二级和三级缓存中获取bean
4
5
refresh
ConfigurationClassPostProcessor.postProcessBeanFactory
- reader : AnnotatedBeanDefinitionReader - classLoader: AppClassLoader - beanFactory: DefaultListableBeanFactory - environment : StandardEnvironment - ignoredDependencyInterfaces: BeanNameAware.class BeanFactoryAware.class BeanClassLoaderAware.class - beanDefinitionMap org.springframework.context.annotation.internalConfigurationAnnotationProcessor : ConfigurationClassPostProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor : AutowiredAnnotationBeanPostProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor : CommonAnnotationBeanPostProcessor org.springframework.context.event.internalEventListenerProcessor : EventListenerMethodProcessor org.springframework.context.event.internalEventListenerFactory : DefaultEventListenerFactory - beanDefinitionNames org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory - scanner : ClassPathBeanDefinitionScanner - registry : AnnotationConfigApplicationContext - beanNameGenerator : AnnotationBeanNameGenerator - includeFilters
2.1
singletonObjects.get(beanName)&&singletonsCurrentlyInCreation
推断构造方法逻辑:取出当前bean的所有构造方法,如果所有构造方法都没有@Autowired注解,那么推断构造方法返回空,如果有多个required=true的@Autowired注解标记的构造方法,那么直接抛出异常,如果不存在required=true的@Autowired注解构造方法,那么就返回标记有@Autowired注解的构造方法+无参构造方法;如果只有一个标记有required=true的构造方法,那么只返回这一个构造方法。
field.set
获取符合条件的advisor
beanFactoryPostProcessor.postProcessBeanDefinitionRegistry
addSingletonFactory
2.2
判断该bean是不是FactoryBean,也就是该bean是否实现了FactoryBean接口,当然这里还会执行beanPostProcessor中的predictBeanType,但是后置处理器需要实现SmartInstantiationAwareBeanPostProcessor接口才会执行。
这里有一点需要说明的是,处理循环引用的时候,首先会从一级缓存中获取,如果获取不到,并且注入的属性bean正在被创建,那么就需要从二级缓存中获取,如果二级缓存获取不到,那么会从三级缓存singletonFactories中获取之前存入的lamda表达式,也就是会执行getEarlyBeanReference方法
循环引用处理逻辑:以orderService、paymentService循环引用为例。1. 创建orderService bean,在三级缓存中存储factoryObject,发现引用paymentService,进而get paymentService2. 找paymentService,先从一级缓存中找,找不到,因为paymentService还没有在创建,所以直接返回空,调用doCreateBean去创建,创建过程中也会在三级缓存中存储在三级缓存中存储factoryObject方法,创建过程中发现引用了orderService,那么就调用getBean创建orderService3. getBean orderService的过程,首先从一级缓存中找,此时找不到,并且此时orderService是在创建中,所以从二级缓存中找,二级缓存找不到,直接去三级缓存中查找,会找到在步骤1时存入的FactoryObject方法,执行这个方法,获得orderService对象,存储到二级缓存,移除三级缓存,进而步骤2的paymentService创建完成,并将paymentService存入1级缓存,移除2级和3级缓存4. 进而执行步骤1,创建orderService,orderService可以正常创建,将orderService存入1级缓存,移除2级和3级缓存5. 以上完成orderService bean的创建,然后执行paymentService的创建,执行getBean,直接从singletonObjects中直接可以获取到,这样paymentService bean也成功获取。
isSingleton
invokeBeanFactoryPostProcessors
初始化前操作,会执行procssor的postProcessBeforeInitialization方法
判断是否需要提前暴露(earlySingletonExposure),如果需要提前暴露,则执行addSingletonFactory
0 条评论
回复 删除
下一页