spring淺析

1、spring啓動流程

  • web容器爲web應用提供一個全局的上下文環境ServletContext,爲IOC容器提供宿主環境。
  • web.xml中有contextLoaderListener,在web容器啓動時觸發容器初始化事件(ApplicationContext可以理解爲IOC容器,具體實現有多個,如XmlWebApplicationContext),加載所有的service、dao、數據庫配置、事務等bean。
  • 容器初始化之後,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE爲屬性Key,將其存儲到ServletContext中。
  • IOC容器初始化完畢後,開始初始化web.xml中配置的DispatcherServlet,mvc的IOC容器,加載controller的bean,並將上一步的ioc容器設置爲自己的父容器。DispatcherServlet實際上是一個標準的前端控制器,用以轉發、匹配、處理每個servlet請求。(個人理解:mvc的IOC容器並不需要放入ServletContext,當接收到的請求爲前端url請求時走的是mvc的IOC容器,當發佈webservice服務時會走ioc容器)

2、spring bean加載過程

        在IoC容器啓動之後,並不會馬上就實例化相應的bean,此時容器僅僅擁有所有對象的BeanDefinition(先通過掃描指定包路徑下的spring註解,比如@Component、@Service、@Lazy @Sope等spring識別的註解或者是xml配置的屬性(通過讀取流,解析成Document,Document)然後spring會解析這些屬性,將這些屬性封裝到BeanDefintaion這個接口的實現類中.)。只有當getBean()調用時纔是有可能觸發Bean實例化階段的活動
        實例化和初始化的區別:實例化是在jvm的堆中創建了這個對象實例,此時它只是一個空的對象,所有的屬性爲null。而初始化的過程就是講對象依賴的一些屬性進行賦值之後,調用某些方法來開啓一些默認加載。比如spring中配置的數據庫屬性Bean,在初始化的時候就會將這些屬性填充,比如driver、jdbcurl等,然後初始化連接。

bean的生命週期可以概括爲9步:

  • 實例化bean對象(通過構造方法或者工廠方法)
  • 設置對象屬性(setter等)(依賴注入)
  • 如果Bean實現了BeanNameAware接口,工廠調用Bean的setBeanName()方法傳遞Bean的ID。(和下面的一條均屬於檢查Aware接口)
  • 如果Bean實現了BeanFactoryAware接口,工廠調用setBeanFactory()方法傳入工廠自身
  • 將Bean實例傳遞給Bean的前置處理器的postProcessBeforeInitialization(Object bean, String beanname)方法
  • 調用Bean的初始化方法(1.實現InitializingBean接口,繼而實現afterPropertiesSet的方法 2.反射原理,配置文件使用init-method標籤直接注入bean 3.@PostConstruct註解),三者的先後順序:@PostConstruct > InitializingBean > init-method
  • 將Bean實例傳遞給Bean的後置處理器的postProcessAfterInitialization(Object bean, String beanname)方法
  • 使用Bean
  • 容器關閉之前,調用Bean的銷燬方法

補充。。
3、beanfactory和factorybean


4、spring解決循環依賴


https://blog.csdn.net/w_linux/article/details/80086950
https://www.cnblogs.com/wyq178/p/11415877.html
https://www.jianshu.com/p/8318afef215c

發佈了68 篇原創文章 · 獲贊 47 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章