Spring 源碼(十一)Spring流程彙總
Spring 容器初始化流程
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 循環依賴流程:app
!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
的自動裝配
Spring MVC 流程圖
- 客戶端用戶發送請求至前端控制器DispatcherServlet。
- DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- HandlerMapping處理器映射器找到具體的處理器(能夠根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。
- DispatcherServlet調用HandlerAdapter處理器適配器,HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。
- Controller控制器執行完成返回ModelAndView,HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
- DispatcherServlet前端控制器將ModelAndView傳給ViewReslover視圖解析器。
- ViewReslover解析後返回具體View。
- DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中),並返回給客戶端用戶。
SpringMVC框架組件說明
如下組件一般使用框架提供實現:jsp
- DispatcherServlet:做爲前端控制器,整個流程控制的中心,控制其它組件執行,統一調度,下降組件之間的耦合性,提升每一個組件的擴展性。
- HandlerMapping:經過擴展處理器映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
- HandlAdapter:經過擴展處理器適配器,支持更多類型的處理器。
- ViewResolver:經過擴展視圖解析器,支持更多類型的視圖解析,例如:jsp、freemarker、pdf、excel等。
歡迎關注本站公眾號,獲取更多信息