Spring 原始碼(十一)Spring流程彙總
阿新 • • 發佈:2019-10-06
Spring 容器初始化流程大致流程如下:
- this():註冊內建的BeanPostProcessor的BeanDefinition到容器
- register(annotatedClasses):註冊配置類 BeanDefinition 到容器
- prepareRefresh():初始化前的準備工作,列如對系統屬性或者環境變數進行驗證
- obtainFreshBeanFactory():初始化 BeanFactory
- prepareBeanFactory(beanFactory):對 BeanFactory 進行各種功能的填充,比如對錶達式的支援等
- postProcessBeanFactory(beanFactory):留給子類擴充套件用
- invokeBeanFactoryPostProcessors(beanFactory):執行BeanFactoryPostProcessor後置處理器
- registerBeanPostProcessors(beanFactory):建立並註冊所有的BeanPostProcessor後置處理
- initMessageSource():初始化訊息元件(國際化,訊息繫結,訊息解析)
- initApplicationEventMulticaster():初始化容器的事件機制
- onRefresh():初始化其他特殊Bean(留給子類做擴充套件用)
- registerListeners():註冊監聽器(ApplicationListener)
- finishBeanFactoryInitialization(beanFactory):建立並註冊所有的單例且非懶載入的Bean
- finishRefresh():完成重新整理過程,通知生命週期處理器 lifecycleProcessor 重新整理過程,同時發出 ContextRefreshEvent 通知別人。
- resetCommonCaches():重置快取
Spring Bean的生命週期
Spring Bean的生命週期:
- InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation():例項化Bean的前置處理
- createBeanInstance(beanName, mbd, args):例項化Bean
- MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition():合併Bean定義資訊(自動裝配元素)
- InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation():例項化Bean的後置處理
- InstantiationAwareBeanPostProcessor#postProcessPropertyValues():Bean的自動裝配
- 部分Aware介面的自動裝配:
BeanNameAware#setBeanName()
、BeanClassLoaderAware#setBeanClassLoader()
、BeanFactoryAware#setBeanFactory()
- BeanPostProcessor#postProcessBeforeInitialization():Bean初始化的前置處理
- 剩餘部分Aware介面的自動裝配:
EnvironmentAware#setEnvironment()
、EmbeddedValueResolverAware#setEmbeddedValueResolver()
、ResourceLoaderAware#setResourceLoader ()
、ApplicationEventPublisherAware#setApplicationEventPublisher ()
、MessageSourceAware#setMessageSource ()
、ApplicationContextAware# setApplicationContext ()
- @PostConstruct:執行初始化方法
- InitializingBean#afterPropertiesSet():執行初始化方法
- @Bean(initMethod = "initMethod"):執行初始化方法
- BeanPostProcessor#postProcessAfterInitialization():Bean初始化的後置處理
- DestructionAwareBeanPostProcessor#postProcessBeforeDestruction():銷燬Bean的後置處理(@PreDestroy)
- DisposableBean#destroy():執行銷燬方法
- @Bean(destroyMethod = "destroyMethod"):執行銷燬方法
Spring AOP執行流程
Spring AOP執行流程:
@EnableAspectJAutoProxy
開啟對AOP的支援,註冊後置處理器AnnotationAwareAspectJAutoProxyCreator
- 根據Class物件找出所有切面類(有
@Aspect
註解的類) - 解析切面類中的增強器(解析@Before等註解),並放入快取中
- 根據
ProxyFactory
工廠類建立AopProxy
代理器 - 根據
AopProxy
代理器建立代理類 - 通過增強器執行入口執行增強器
JdkDynamicAopProxy#invoke()
或CglibAopProxy.DynamicAdvisedInterceptor#intercept()
- 獲取連結鏈
AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice()
- 以遞迴方式執行攔截鏈
ReflectiveMethodInvocation.proceed()
Spring 迴圈依賴:
Spring 迴圈依賴流程:
!this.singletonsCurrentlyInCreation.remove(beanName)
:將當前正建立Bean的標示放到Set集合中,如果失敗則說明發生了迴圈建立,直接丟擲BeanCurrentlyInCreationException
異常,防止死迴圈addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory)
:將完成例項化但是還未完成賦值的物件放到singletonFactories
容器中,提前暴露出來getSingleton(String beanName, boolean allowEarlyReference)
:當有物件建立過程中需要當前正在建立中的物件的時候就需要從singletonFactories
容器中獲取物件,這時我們可以通過後置處理器SmartInstantiationAwareBeanPostProcessor
對獲取到的物件進特殊處理,然後放到earlySingletonObjects
容器中- 最後將建立完成的Bean放到
singletonObject
容器中
Spring Bean的自動裝配
Spring Bean的自動裝配過程:
- 根據
Class
物件,通過反射獲取所有的Field
和Method
資訊 - 通反射獲取
Field
和Method
的註解資訊,並根據註解型別,判斷是否需要自動裝配 - 將需要自動裝配的元素,封裝成
AutowiredFieldElement
或AutowiredMethodElement
物件 - 呼叫
AutowiredFieldElement
或AutowiredMethodElement
的inject
方法,喚起後續步驟 - 通過呼叫容器的
getBean()
方法找到需要注入的源資料Bean - 通過反射將找到的源資料Bean注入到目標Bean中
Spring Aware的自動裝配
- 判斷是否實現了
Aware
介面 - 判斷具體實現了那個
Aware
介面 - 直接呼叫
XxxAware
介面的特有方法實現XxxAware