Spring原始碼心得

阿-牛發表於2020-11-04

Spring所有的管理都是基於IOC容器的,Ioc容器中管理的都是一些bean,那麼這些bean是如何來的呢?

  1. beanDefinitonReader:負責讀取有關bean的配置說明,如 xml配置bean需要掃描的包路徑,又或者是 @annotation 方式;
  2. beanDefinitionScan:負責在指定的包路徑下,掃描出滿足條件的bean類;
  3. beanDefinitionRegistry:負責將掃描出來的bean類,註冊到一個統一的地方,我們叫做一級快取,beanDefinitionMap;
  4. beanFactory:一個冷血的生產機器,根據入參的bean 名字,來生產出指定的bean(既負責生產,也負責獲取)

擴充點:在beanFactory 生產bean之前,還有兩個很關鍵的後置處理器
1、BeanFactoryPostProcessor:可以修改bean的具體對映,例如汽車car可能被修改成火車train
2、BeanDefinitionRegistryPostProcessor:可以新增定義的bean 定義。

BeanFactory 是通過getBean 來負責生產bean的,其中涉及到:

  1. 反射成具體的bean類(擴充:反射的兩種實現方式 @1:cglib @2:jdk 。spring中是通過jdk實現的)
  2. 填充屬性(被@autowired @value... 修飾的屬性被賦值)
  3. 初始化(initMethod,一般情況下aop是在這一層實現的)

在getBean 整個過程中,其實還有好多bean的後置處理器,就是我們經常說的ware。

舉例AnnotationConfigApplicationContext啟動都幹嘛了

  1. 初始化beanFactory(DefaultListableBeanFactory)
  2. 初始化beanDefinitionReader:這裡面註冊了處理器類,如:beanDefinition
  3. 初始化beanDefinitionScan
  4. refresh

BeanFactory 與 Application的區別?

1、beanFactory是父類,applicationContext繼承與beanfactory;
2、applicationContext功能強大,有國際化,擴充套件點,但是beanFactory 只能獲取bean,如果要新增一個bean,必須要註冊一個registry.

 

 

相關文章