【學習】json格式的AbstractApplicationContext.refresh()

寫在前面

用json格式記錄的refreash方法,有需要的小夥伴可以看看,核心方法其實就是invokeBeanFactoryPostProcessors和finishBeanFactoryInitialization
參考:

{
“remark”: “spring容器啓動流程”,
“AbstractApplicationContext.refresh()”: [
{
“remark”: "初始化配置,並檢測,通過springboot啓動的應用,沒有特殊內容,暫時不管 ",
“originalRemark”: "Prepare this context for refreshing. ",
“AbstractApplicationContext.prepareRefresh”: [
“AbstractApplicationContext.initPropertySources”,
“AbstractApplicationContext.getEnvironment().validateRequiredProperties()”
]
},
{
“remark”: “初始化bean工廠”,
“originalRemark”: "Tell the subclass to refresh the internal bean factory. ",
“AbstractApplicationContext.obtainFreshBeanFactory”: [
“1. 設置容器id”,
“2. 返回bean工廠”
]
},
{
“remark”: “容器準備”,
“originalRemark”: “Prepare the bean factory for use in this context”,
“AbstractApplicationContext.prepareBeanFactory”: [
“1. bean屬性設置 setBeanClassLoader setBeanExpressionResolver addPropertyEditorRegistrar”,
“2. 增加BeanPostProcessor ApplicationContextAwareProcessor ApplicationListenerDetector”,
“3. ignoreDependencyInterface 依賴注入時忽略這些依賴,在AbstractAutowireCapableBeanFactory.populateBean方法中調用,會過濾這些依賴”,
“4. registerResolvableDependency 依賴注入某些接口,返回對應的對象,詳細見resolvableDependencies 用法”,
“5. 將環境變量注入容器中,”
]
},
{
“remark”: “容器後置處理,目前實現爲空”,
“originalRemark”: “Allows post-processing of the bean factory in context subclasses.”,
“AbstractApplicationContext.postProcessBeanFactory”: {
}
},
{
“remark”: “觸發容器後置處理器執行”,
“originalRemark”: “Invoke factory processors registered as beans in the context”,
"AbstractApplicationContext.invokeBeanFactoryPostProcessors 內部調用 ": [
{
"如果容器是:BeanDefinitionRegistry(bean定義註冊器?)特殊處理BeanDefinitionRegistryPostProcessor,調用它的postProcessBeanDefinitionRegistry方法, ": [
“在mybatis中就是實現了該接口”,
“1. 【處理容器中已有的processor】,”,
“2. 【處理容器中定義的實現了PriorityOrdered】”,
“3. 【處理容器中定義的實現了Ordered】”,
“4. 【處理容器中定義的沒有實現上訴接口的】”,
“重要的BeanDefinitionRegistryPostProcessor=============:”,
“ConfigurationClassPostProcessor: 用來處理ComponentScans 和 ComponentScan,PropertySource,PropertySources等配置的,他的掃描就是ClassPathBeanDefinitionScanner,mybatis和這個一模一樣”,
“MapperScannerConfigurer mybatis配置類 他的整體邏輯很像上面的ConfigurationClassPostProcessor”,
“PropertySourcesPlaceholderConfigurer 加載各種配置,也會加載EnvironmentAware 部分配置 https://www.jianshu.com/p/a3c7ff0de5ac”,
"PropertyPlaceholderConfigurer 與上面只相差一個EnvironmentAware 接口實現 ",
“但是@value屬性是在AnnotationXXXX中處理的,在AbstractBeanFactory.resolveEmbeddedValue中調用的”,
"EventListenerMethodProcessor implements SmartInitializingSingleton, ApplicationContextAware, BeanFactoryPostProcessor ",
“EventListenerMethodProcessor 在這一步初始化eventListenerFactories”,
“SmartInitializingSingleton 的執行時機是bean初始化完成之後”,
“”,
"ConfigurationBeanFactoryMetadata "
],
“否者 invokeBeanFactoryPostProcessors”: “”
},
“再從容器中獲取BeanFactoryPostProcessor,分別按PriorityOrdered,ordered,沒有順序的依次執行postProcessBeanFactory”,
“重要的BeanFactoryPostProcessor===============”
]
},
{
“remark”: “註冊BeanPostProcessor”,
“AbstractApplicationContext.registerBeanPostProcessors”: [
{
“prepareBeanFactory期間創造的”: [
“ApplicationContextAwareProcessor 這個類在bean初始化時,處理EnvironmentAware,ResourceLoaderAware等”,
“WebApplicationContextServletContextAwareProcessor 處理 ServletContextAware ServletConfigAware等”,
"ImportAwareBeanPostProcessor 處理ImportAware "
]
},
{
“PriorityOrdered”: [
“ConfigurationPropertiesBindingPostProcessor 觸發時機是在 initializeBean 暫忽略”,
“CommonAnnotationBeanPostProcessor 處理初始化方法,invokeInitMethods,處理@PostConstruct等方法”,
“AutowiredAnnotationBeanPostProcessor 在populate 那已經處理了,用於處理@Autowire和@Value”
]
},
{
“summary”: "這三個都是 AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator ",
“Ordered”: [
{
"AnnotationAwareAspectJAutoProxyCreator ": [
"AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator ",
“AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware”,
“SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor extends BeanPostProcessor”,
{
“wrapIfNecessary”: [
“isInfrastructureClass 判斷是不是Advisor 等相關的類 shouldSkip 判斷是否需要跳過,”,
“找到配置的攔截器 Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null)”,
{
“創建代理AbstractAutoProxyCreator.createProxy”: [
“爲beanDefinition 設置ORIGINAL_TARGET_CLASS_ATTRIBUTE屬性”,
“構建ProxyFactory”,
{
“ProxyFactory.getProxy(java.lang.ClassLoader)”: [
“返回代理工廠類 org.springframework.aop.framework.ProxyCreatorSupport.getAopProxyFactory”,
"根據配置或者類屬性,返回對應的代理 org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy ",
{
“CglibAopProxy.getProxy(java.lang.ClassLoader)”: [
"組裝 Cglib Enhancer ",
“創建代理”,
“執行調用CglibMethodInvocation.invokeJoinpoint”
]
}
]
}
]
}
]
}
]
},
“AsyncAnnotationBeanPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor extends AbstractAdvisingBeanPostProcessor implements BeanFactoryAware”,
"AbstractAdvisingBeanPostProcessor extends ProxyProcessorSupport implements BeanPostProcessor ",
“ProxyProcessorSupport extends ProxyConfig implements Ordered, BeanClassLoaderAware, AopInfrastructureBean”,
“實現和aop註解的差不多,就是特殊處理,已經是代理對象的情況,如果沒有再組裝ProxyFactory,後面就和上面一樣了”,
",
“MethodValidationPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor implements InitializingBean”,
“這個就和AsyncAnnotationBeanPostProcessor完全一樣了,這兩個就是註解不一樣”
]
},
{
“NoneOrdered”: [
"ErrorPageRegistrarBeanPostProcessor ",
"WebServerFactoryCustomizerBeanPostProcessor "
]
},
{
"MergedBeanDefinitionPostProcessor ": [
“CommonAnnotationBeanPostProcessor 處理初始化方法,invokeInitMethods,處理@PostConstruct等方法”,
"AutowiredAnnotationBeanPostProcessor 在populate 那已經處理了,用於處理@Autowire和@Value "
]
}
]
},
{
“remark”: “初始化國際化資源,用於異常提示之類的,暫放棄”,
“originalRemark”: “Initialize message source for this context.”,
“AbstractApplicationContext.initMessageSource”: {
}
},
{
“remark”: “初始化事件廣播器,便於後面廣播,大概是觀察者模式吧,暫不看”,
“originalRemark”: “Initialize event multicaster for this context.”,
“AbstractApplicationContext.initApplicationEventMulticaster”: {
}
},
{
“remark”: “空白”,
“originalRemark”: “空白”,
“AbstractApplicationContext.onRefresh”: {
}
},
{
“remark”: “爲了上面的事件通知器,添加listener,發生事件時,通知這些類”,
“originalRemark”: “Check for listener beans and register them.”,
“AbstractApplicationContext.registerListeners”: {
}
},
{
“remark”: “初始化所有的非懶加載的類”,
“originalRemark”: “Instantiate all remaining (non-lazy-init) singletons.”,
“AbstractApplicationContext.finishBeanFactoryInitialization”: [
{
“remark”: “實例化所有的非懶加載的 單例”,
“DefaultListableBeanFactory.preInstantiateSingletons”: [
{
“1. foreach 所有的bean定義 進行實例化”: [
“1. 工廠bean特殊判斷”,
{
“2. 調用getBean -> 調用doGetBean(這裏忽略從緩存中拿的邏輯)”: [
“1. 從父類中拿”,
“2. final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);”,
“3. 處理dependsOn, 從容器中獲取依賴的bean”,
{
“4. getSingleton -> createBean”: [
“(Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.)”,
“resolveBeforeInstantiation 在bean初始化之前,嘗試提前返回一個代理類”,
“實際是:InstantiationAwareBeanPostProcessor特殊處理,如果返回不是空,則返回該代理”,
"簡單配置後發現沒有返回bean的, XXX暫時不管XXX ",
"
=============”,
{
“doCreateBean”: [
{
“applyMergedBeanDefinitionPostProcessors”: [
“調用MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition”
]
},
{
“populateBean”: [
“特殊處理:InstantiationAwareBeanPostProcessor, AutowiredAnnotationBeanPostProcessor 就是在這處理的,調用postProcessProperties”
]
},
{
“initializeBean”: [
“invokeAwareMethods 內部有3個aware接口,beanName,BeanFactory,classLoader”,
“applyBeanPostProcessorsBeforeInitialization 處理BeanPostProcessor postProcessBeforeInitialization,例如applicationContext, postConstruct”,
“invokeInitMethods:(InitializingBean ,指定initMethod)”,
“applyBeanPostProcessorsAfterInitialization 處理BeanPostProcessor postProcessAfterInitialization,例如三個代理實現等”
]
},
{
“registerDisposableBeanIfNecessary”: []
}
]
}
]
}
]
}
]
},
“2. SmartInitializingSingleton 後置處理,Trigger post-initialization callback for all applicable beans…”
]
}
]
},
{
“remark”: “事件通知等”,
“AbstractApplicationContext.finishRefresh”: {
}
}
]
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章