spring總結-面試相關

一、bean的生命週期

new–>注入–>setBeanId–>setBeanFactory–>setApplicationContext(獲取其他bean)–>postProcessBeforeInitialization,修改bean–>init-method初始化–>postProcessAfterInitialization–>destory()–>destroy-method定製的銷燬方法

  1. 實例化bean—new的過程

  2. 按照spring上下文對實例化的bean進行配置—IOC注入過程

  3. 若Bean實現了BeanNameAware接口,則調用setBeanName方法,傳遞的是spring配置文件的Bean的id

  4. 若Bean實現了BeanFactoryAware接口,則調用setBeanFactory方法,傳遞beanFactory的實例傳入可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以);

  5. 若Bean實現了ApplicationContext接口,則調用setApplicationContext方法,將bean所在的應用上下文傳入(同樣這個方式也可以實現步驟4的內容,但比4更好,因爲ApplicationContext是BeanFactory的子接口,有更多的實現方法)

  6. 若Bean實現了BeanPostProcessor接口,則調用post-processBeforeInitialization方法。BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用那個的方法,也可以被應用於內存或緩存技術;

  7. 如果Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。

  8. 如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法、
    此時,bean的初始化過程完成,可以應用這個bean,是singleton的。當Bean不再需要時,會經過清理階段,

  9. 如果Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法;
    10.如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。

二、spring的IOC初始化過程

主線:讀取xml配置—>解析xml配置—>註冊到BeanFactory

  1. ClassPathXmlApplicationContext構造函數

    • 設置xml文件資源
    • 核心函數refresh()。實現IOC的初始化
  2. ClassPathXmlApplicationContext的核心函數:refresh()爲同步函數(synchronized代碼塊),

    • 核心代碼–作用創建beanFactory:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(),BeanFactory的創建和Bean的解析都在該函數中進行
  3. ConfigurableListableBeanFactory核心函數:refreshBeanFactory函數。

    • createBeanFactory()方法,創建BeanFactory,主要關注DefaultListableBeanFactory中的beanDefinitionMap成員變量,該變量用於後續存儲bean相關數據
    • 關鍵函數loadBeanDefinitions
三、springboot的啓動過程
1、入口函數:SpringApplication.run(App.class),接收一個由@SpringBootApplication註解的配置類App.class,實現內容: 1、實例化SpringApplication的實例,2、調用實例方法run()。作爲整個應用程序的起點。
  • 1.1、實構造SpringApplication實例,實現了以下幾個功能:
    • (1)、計算當前的上下文類型(判斷依據就是特定的上下文類是否存在)
    • (2)、加載一批初始化器(初始化器是ApplicationContextInitializer的實現),用來對整個核心容器進行初始化操作
    • (3)、加載一批監聽器(監聽器是ApplicationListener的實現),用來在初始階段響應特定的容器事件以進行編程擴展,
  • 1.2、調用SpringApplication.run()方法,實現以下功能:
    • (1)、啓動監聽程序
    • (2)、封裝參數信息
    • (3)、封裝環境變量信息
    • (4)、創建合適的applicationContext實例,需要定義出掃描bean定義的能力和從註解中解析bean定義的能力
  • 1.3、執行上下文的準備工作。
    • (1)、完成環境變量的設置
    • (2)、設置resourceLoader加載器
    • (3)、應用初始化器,通知容器就緒事件,加載配置資源,執行load
    • (4)、將所有通過註解、掃描、配置文件方式定義的bean都註冊到上下文中去。通知load完成事件
  • 1.4、執行刷新操作。調用了父類的refresh(AbstractApplicationContext定義,工廠方法)執行容器的刷新操作,是整個應用上下文啓動的核心階段,三大類:BeanFactory、Bean初始化、事件廣播
    • (1)、執行prepareRefresh執行刷新前的準備工作:更新應用上下文、初始化屬性資源、驗證配置文件
    • (2)、初始化BeanFactory並配置,其子類可覆蓋做額外處理;
    • (3)、調用所有已添加的BeanFactoryPostProcessors,在bean的創建的前後,做定製化功能的擴展。
    • (4)、初始化消息資源,初始化上下文事件多播機制,
    • (5)、檢查Bean中的監聽器並註冊到多播器中,
    • (6)、實例化所有非懶加載的Bean到BeanFactory中.
  • 1.5、執行刷新後的操作,清除緩存的資源,初始化生命週期處理器並觸發容器刷新操作,多播容器刷新事件,至此容器刷新完成.
  • 1.6、調用afterRefresh執行刷新後的操作,多播容器啓動事件
  • 1.7、回調CommandLineRunner,ApplicationRunner的Bean實現
  • 1.8、多播上下文運行事件
四、BeanFactory與ApplicationContext
4.1、延遲加載:
  • BeanFactroy採用的是延遲加載形式來注入Bean的,即**只有在使用到某個Bean時(調用getBean()),纔對該Bean進行加載實例化,**這樣,我們就不能發現一些存在的Spring的配置問題
  • 而ApplicationContext則相反,它是在容器啓動時,一次性創建了所有的Bean。這樣,在容器啓動時,我們就可以發現Spring中存在的配置錯誤。 相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用內存空間。當應用程序配置Bean較多時,程序啓動較慢。
4.2、BeanPostProcessor和BeanFactoryPostProcessor的使用
  • BeanFactory需要手動註冊,
  • ApplicationContext則是自動註冊。
總結
  • BeanFactory是Spring的心臟,那麼ApplicationContext就是完整的軀體了,ApplicationContext由BeanFactory派生而來,提供了更多面向實際應用的功能
  • 在BeanFactory中,很多功能需要以編程的方式實現,而在ApplicationContext中則可以通過配置實現。
  • BeanFactorty接口提供了配置框架及基本功能,但是無法支持spring的aop功能和web應用。
  • ApplicationContext接口作爲BeanFactory的派生,因而提供BeanFactory所有的功能,並有以下擴展功能:
    • (1)MessageSource, 提供國際化的消息訪問
    • (2)資源訪問,如URL和文件
    • (3)事件傳播特性,即支持aop特性
    • (4)載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層 ApplicationContext:是IOC容器另一個重要接口, 它繼承了BeanFactory的基本功能, 同時也繼承了容器的高級功能,如:MessageSource(國際化資源接口)、ResourceLoader(資源加載接口)、ApplicationEventPublisher(應用事件發佈接口)等。
五、BeanFactory與FactoryBean
  • BeanFactory,是個Factory,也就是IOC容器或對象工廠,是spring的核心,主要起創建和管理bean的作用
  • FactoryBean,工廠類接口,用戶可以通過實現該接口定製實例化Bean的邏輯。
    • T getObject():
      返回由FactoryBean創建的Bean實例,如果isSingleton()返回true,則該實例會放到Spring容器中單實例緩存池中;
    • boolean isSingleton():
      返回由FactoryBean創建的Bean實例的作用域是singleton還是prototype;
    • Class getObjectType():
      返回FactoryBean創建的Bean類型。
      當配置文件中的class屬性配置的實現類是FactoryBean時,通過getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的對象,相當於FactoryBean#getObject()代理了getBean()方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章