1. 程式人生 > >spring源碼分析之初始化過程

spring源碼分析之初始化過程

源碼分析 true singleton 存在 factory 源碼 org 包含 eric

1.org.springframework.web.context.ContextLoaderListener 一個ServletContextListener,web容器啟動監聽器

  1.1內有成員ContextLoader,當contextInitialized時,調用this.contextLoader.initWebApplicationContext(event.getServletContext());

2.org.springframework.web.context.ContextLoader.createWebApplicationContext(ServletContext, ApplicationContext) 創建ApplicationContext

在此方法中調用org.springframework.context.support.AbstractApplicationContext.refresh()

技術分享圖片

3.在refresh方法裏面org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(),創建BeanFactory對象,具體方法在org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory()

技術分享圖片

4.創建BeanFactory之後加載BeanDefinitions org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory)

技術分享圖片

註意,beanfactory同時也是BeanDefinitionRegistry,在讀取到bean後調用org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition)將bean定義放到beanDefinitionMap緩存,

ApplicationContext同時也是resourceloader,org.springframework.context.support.GenericApplicationContext.getResources(String)讀取資源

5. fresh後面,當beanfactory初始化完之後,調用org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(ConfigurableListableBeanFactory)單例bean的實例化過程,單例bean實例保存在singletonObjects中。

技術分享圖片

技術分享圖片

6.獲取bean,如果沒有就創建org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(String, Class<T>, Object[], boolean),如果是工廠bean,先創建工廠bean,然後從工廠bean創建對象,單例的工廠bean存儲在factoryBeanObjectCache中,註意,單例不僅是isSingleton返回true而且bean本身必須是單例。

技術分享圖片

技術分享圖片

7.創建bean, org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[]),其中,調用org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[])

技術分享圖片

8.BeanWrapper裏面包含bean實例等信息,bean屬性註入也在這裏org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(String, AbstractBeanDefinition, BeanWrapper):

技術分享圖片

9.bean實例的後處理org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)

技術分享圖片

技術分享圖片

其中,org.springframework.context.support.ApplicationContextAwareProcessor後處理在springMVC中尤為關鍵,因為org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping實現了ApplicationContextAwareProcessor這一接口,這個類就是解析所有requestMapping註解,獲得並緩存請求url與處理類關系的。

spring源碼分析之初始化過程