SpringIOC
2021-08-19 15:05:42 0 举报
AI智能生成
Spring IOC 源码脑图
作者其他创作
大纲/内容
AbstractApplicationContext
ClassPathXmlApplicationContext
refresh();
obtainFreshBeanFactory()
AnnotationConfigApplicationContext
创建Bean工厂 BeanFactory<br>DefaultListableBeanFactory 注意实现了Bean定义注册器 BeanDefinitionRegistry<br>
创建Bean定义读取器 BeanDefinitionReader(AnnotatedBeanDefinitionReader)
beanDefs.add -> ConfigurationClassPostProcessor
beanDefs.add -> AutowiredAnnotationBeanPostProcessor
beanDefs.add -> CommonAnnotationBeanPostProcessor
beanDefs.add -> EventListenerMethodProcessor
beanDefs.add -> DefaultEventListenerFactory
创建Bean定义扫描器 BeanDefinitionScanner(ClassPathBeanDefinitionScanner)
注册传入的配置类 register(componentClasses); -> reader.register(componentClasses);
refresh();
obtainFreshBeanFactory();
refreshed=true
beanFactory.setSerializationId
return beanFactory;
invokeBeanFactoryPostProcessors(beanFactory);
BeanDefinitionRegistryPostProcessor<br>PriorityOrdered<br>postProcessBeanDefinitionRegistry<br>
org.springframework.context.annotation.internalConfigurationAnnotationProcessor<br>ConfigurationClassPostProcessor<br>processConfigBeanDefinitions<br>
configCandidates<br>ConfigurationClassUtils.checkConfigurationClassCandidate<br>
configCandidates -> do…while
ConfigurationClassParser.parse(candidates);
doProcessConfigurationClass
@Component -> processMemberClasses
@PropertySource -> processPropertySource
@ComponentScan
componentScanParser.parse
scanner.doScan(basePackages);
findCandidateComponents
scanCandidateComponents
getResources(packageSearchPath)
isCandidateComponent
registerBeanDefinition<br>beanDefinitionNames.add(beanName);<br>
ConfigurationClassUtils.checkConfigurationClassCandidate<br>ConfigurationClassParser.parse(candidates);
@Import -> processImports
@ImportResource -> configClass.addImportedResource
@Bean -> retrieveBeanMethodMetadata
interfaces -> processInterfaces
superclass -> knownSuperclasses.put(superclass, configClass);return sourceClass.getSuperClass();
configClasses=parser.getConfigurationClasses();
reader.loadBeanDefinitions(configClasses);
newCandidateNames = registry.getBeanDefinitionNames() - candidateNames;
ConfigurationClassUtils.checkConfigurationClassCandidate(newCandidateBeanDefinition);
configCandidates -> ConfigurationClassParser.parse(candidates);
BeanDefinitionRegistryPostProcessor<br>Ordered<br>postProcessBeanDefinitionRegistry
BeanDefinitionRegistryPostProcessor<br>postProcessBeanDefinitionRegistry
BeanDefinitionRegistryPostProcessor<br>postProcessBeanFactory<br>
enhanceConfigurationClasses<br>传入的配置类会被CGLIB代理,对类内部对象进行getBean
BeanFactoryPostProcessor<br>(AbstractApplicationContext.beanFactoryPostProcessors用context.add才有)<br>postProcessBeanFactory<br>
BeanFactoryPostProcessor<br>PriorityOrdered<br>postProcessBeanFactory<br>
BeanFactoryPostProcessor<br>Ordered<br>postProcessBeanFactory
BeanFactoryPostProcessor<br>postProcessBeanFactory
finishBeanFactoryInitialization(beanFactory);
beanFactory.freezeConfiguration();
beanFactory.preInstantiateSingletons();
List<String> beanNames=new ArrayList<>(this.beanDefinitionNames);
RootBeanDefinition bd=getMergedLocalBeanDefinition(beanName);
!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()<br>非抽象、单例、非懒加载
isFactoryBean(beanName)<br>是否为工厂Bean
getBean(beanName);
String beanName=transformedBeanName(name);
getSingleton(beanName); <br>-> getSingleton(beanName,true)<br>缓存检查<br>
getSingleton(beanName,allowEarlyReference)
singletonObjects.get(beanName);<br>从一级缓存拿对象没有<br>
isSingletonCurrentlyInCreation(beanName) <br>一级缓存为空看是否正在创建<br>singletonsCurrentlyInCreation.contains(beanName);<br>
earlySingletonObjects.get(beanName);<br>一级缓存没有且正在创建,检查二级缓存
allowEarlyReference=true (resolving a circular reference)<br>二级缓存没有 且 允许早期引用当前创建的单例
synchronized(singletonObjects)
singletonObjects.get(beanName)<br>检查一级缓存没有
earlySingletonObjects.get(beanName)<br>检查二级缓存没有
ObjectFactory<?> singletonFactory=singletonFactories.get(beanName);<br>singletonObject=singletonFactory.getObject();<br>从三级缓存取出来函数接口创建实例
earlySingletonObjects.put(beanName, singletonObject);<br>放到二级缓存中
singletonFactories.remove(beanName);<br>从三级缓存移除
isPrototypeCurrentlyInCreation(beanName)<br>若在创建中,则 throw BeanCurrentlyInCreationException<br>Spring 只能解决单例对象的 setter 注入的循环依赖,不能解决构造器注入。<br>
parentBeanFactory.getBean<br>有父容器,则检查父容器
!typeCheckOnly -> markBeanAsCreated(beanName);<br>typeCheckOnly:是否获取实例是为了进行类型检查,而不是为了实际使用<br>标记bean被创建了或者正要被创建<br>
String[] dependsOn=mbd.getDependsOn();<br>解析依赖Bean,若有则先创建依赖的Bean
registerDependentBean(dep, beanName);<br>
getBean(dep);
mbd.isSingleton()<br>
sharedInstance=getSingleton(beanName,() -> { <br> createBean(beanName,mergedBeanDefinition,args); <br>});<br>
getSingleton(beanName,singletonFactory)<br>创建Bean
synchronized(singletonObjects)
Object singletonObject=singletonObjects.get(beanName);<br>为空,一级缓存没有,进行创建
beforeSingletonCreation(beanName);<br>标记正在创建
inCreationCheckExclusions.contains(beanName)<br>
singletonsCurrentlyInCreation.add(beanName)<br>标记正在创建
singletonObject=singletonFactory.getObject();
afterSingletonCreation(beanName);
inCreationCheckExclusions.contains(beanName)
singletonsCurrentlyInCreation.remove(beanName)<br>移除正在创建
addSingleton(beanName,singletonObject);
synchronized(singletonObjects)<br>
singletonObjects.put(beanName, singletonObject);<br>加入到一级缓存中(单例缓存池)
singletonFactories.remove(beanName);<br>从三级缓存中移除
earlySingletonObjects.remove(beanName);<br>从二级缓存中移除(循环依赖时 早期对象 存在于二级缓存)
registeredSingletons.add(beanName);<br>用来记录保存已经处理的bean<br>
createBean(beanName,mbd,args);
RootBeanDefinition mbdToUse=mbd;
Class<?> resolvedClass=resolveBeanClass(mbd,beanName);
mbdToUse.prepareMethodOverrides();<br>XML中的 lookup-method 和 replace-method 场景
Object bean=resolveBeforeInstantiation(beanName,mbdToUse);<br>if(bean!=null) return bean;<br>第一次调用BeanPostProcessor<br>可能有BeanPostProcessors创建代理对象<br>此步骤可阻止Spring容器创建对象,而使用自己实现的方法创建<br>
bean=applyBeanPostProcessorsBeforeInstantiation(targetType,beanName);
getBeanPostProcessors()
bp instanceof InstantiationAwareBeanPostProcessor
ibp.postProcessBeforeInstantiation(beanClass,beanName);
bean=applyBeanPostProcessorsAfterInitialization(bean,beanName);
Object beanInstance=doCreateBean(beanName,mbdToUse,args);
mbd.isSingleton() -> factoryBeanInstanceCache.remove(beanName);
BeanWrapper instanceWrapper=createBeanInstance(beanName,mbd,args);<br>实例化bean(Supplier、反射实例化、工厂实例化(@Bean))
Class<?> beanClass=resolveBeanClass(mbd,beanName);
…………
Object bean=instanceWrapper.getWrappedInstance();
Class<?> beanType=instanceWrapper.getWrappedClass();
synchronized(mbd.postProcessingLock)
applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName);
earlySingletonExposure=<br> mbd.isSingleton() &&<br> allowCircularReferences &&<br> singletonsCurrentlyInCreation.contains(beanName)<br>处理循环依赖<br>
addSingletonFactory(beanName,() -> getEarlyBeanReference(beanName,mbd,bean));
addSingletonFactory(beanName,singletonFactory)
synchronized(singletonObjects)
!singletonObjects.containsKey(beanName)<br>一级缓存没有
singletonFactories.put(beanName,singletonFactory)<br>放到三级缓存里
earlySingletonObjects.remove(beanName);<br>从二级缓存移除
registeredSingletons.add(beanName);
getEarlyBeanReference(beanName,mbd,bean)
!mbd.isSynthetic()&&hasInstantiationAwareBeanPostProcessors
getBeanPostProcessors()
bp instanceof SmartInstantiationAwareBeanPostProcessor<br>包括AbstractAutoProxyCreator,可使用AOP创建动态代理<br>
ibp.getEarlyBeanReference(exposedObject,beanName)
populateBean(beanName,mbd,instanceWrapper);<br>属性赋值
getBeanPostProcessors()
bp instanceof InstantiationAwareBeanPostProcessor
ibp.postProcessAfterInstantiation(bw.getWrappedInstance(),beanName)
mbd.getResolvedAutowireMode()
autowireByName(beanName,mbd,bw,newPvs);
autowireByType(beanName,mbd,bw,newPvs);
hasInstantiationAwareBeanPostProcessors
getBeanPostProcessors()
bp instanceof InstantiationAwareBeanPostProcessor
ibp.postProcessProperties(pvs,bw.getWrappedInstance(),beanName);
…………
exposedObject=initializeBean(beanName,exposedObject,mbd);<br>初始化<br>包括Aware、@PostConstruct、InitializingBean.afterPropertiesSet、initMethod
invokeAwareMethods(beanName,bean);<br>调用三个Aware<br>其他的在ApplicationContextAwareProcessor.invokeAwareInterfaces中调用
BeanNameAware.setBeanName(beanName);
BeanClassLoaderAware.setBeanClassLoader(getBeanClassLoader());
BeanFactoryAware.setBeanFactory(AbstractAutowireCapableBeanFactory.this);
applyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName);<br>包括@PostConstruct(在CommonAnnotationBeanPostProcessor)
getBeanPostProcessors()
postProcessBeforeInitialization(result,beanName);
invokeInitMethods(beanName,wrappedBean,mbd);
applyBeanPostProcessorsAfterInitialization(wrappedBean,beanName);<br>AOP动态代理
getBeanPostProcessors()
postProcessAfterInitialization(result,beanName);
earlySingletonExposure<br>使用上边的变量
earlySingletonReference=getSingleton(beanName,false);
…………
registerDisposableBeanIfNecessary(beanName,bean,mbd);
bean=getObjectForBeanInstance(sharedInstance,name,beanName,mbd);
mbd.isPrototype()<br>
beforePrototypeCreation(beanName);<br>
prototypeInstance=createBean(beanName,mbd,args);<br>
afterPrototypeCreation(beanName);<br>
bean=getObjectForBeanInstance(prototypeInstance,name,beanName,mbd);
else<br>String scopeName=mbd.getScope();<br>Scope scope=this.scopes.get(scopeName);<br>
scopedInstance=scope.get(beanName,() -> {<br> beforePrototypeCreation(beanName);<br> createBean(beanName, mbd, args);<br> afterPrototypeCreation(beanName);<br>});<br>
bean=getObjectForBeanInstance(scopedInstance,name,beanName,mbd);
refresh();
prepareRefresh();
obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
initMessageSource();
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory);
finishRefresh();
resetCommonCaches();
BeanPostProcessors
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(beanClass,beanName);
Aware
initializeBean(beanName,exposedObject,mbd); <br>-> <br>invokeAwareMethods(beanName, bean);<br>
BeanNameAware.setBeanName(beanName);
BeanClassLoaderAware.setBeanClassLoader(getBeanClassLoader());
BeanFactoryAware.setBeanFactory(AbstractAutowireCapableBeanFactory.this);
ApplicationContextAwareProcessor.postProcessBeforeInitialization(bean,beanName)<br>-><br>invokeAwareInterfaces(bean);<br>
EnvironmentAware.setEnvironment(applicationContext.getEnvironment());
EmbeddedValueResolverAware.setEmbeddedValueResolver(embeddedValueResolver);
ResourceLoaderAware.setResourceLoader(applicationContext);
ApplicationEventPublisherAware.setApplicationEventPublisher(applicationContext);
MessageSourceAware.setMessageSource(applicationContext);
ApplicationContextAware.setApplicationContext(applicationContext);
0 条评论
下一页