這次主要看了下bean的生成過程,發現個畫時序圖很好用的軟件plantuml,充分發揮程序員的能力,能用代碼解決的別叨叨別的😀
1、調用ApplicationContext的genBean方法會調用到AbstractApplicationContext的getBean方法,這個方法里面其實就是交由BeanFactory調用getBean
2、DefaultListableBeanFactory中會先根據類型獲取beanNames,然后根據beanName調用AbstractBeanFactory的doGetBean方法
3、AbstractBeanFactory中首先轉化beanName,然后看去緩存map中看是否存在已有數據,第一次調用肯定返回null。然后去獲取RootBeanDefinition,獲取DependsOn依賴的bean,如果存在依賴Bean需要先初始化依賴的bean,之后調用getSingleton方法來獲取單例類
4、在DefaultSingletonBeanRegistry#getSingleton中又調用ObjectFactory#getObject來獲取對象,這個函數里面主要調用了createBean來生成對象
5、AbstractAutowireCapableBeanFactory#createBean
5.1、resolveBeanClass根據BeanDefinition獲取Bean的類並加載
5.2、doCreateBean-->createBeanInstance這里會獲取Bean的構建方法,並根據是否有構建方法,是否有構建參數最終bean的構建方式
5.3、autowireConstructor會構建ConstructorResolver來構建Bean
6、ConstructorResolver#autowireConstructor,從BeanDefinition中獲取構建參數,之后根據Bean的class獲取已有的構造函數並根據構造參數值獲取相匹配的構造函數,之后就是調用SimpleInstantiationStrategy#instantiate方法,這個方法里面其實就是調用BeanUtils.instantiateClass(ctor, args)方法,利用java的反射機制來構建一個對象,到此就得到了需要構建的對象
7、之后再AbstractAutowireCapableBeanFactory中會調用bean相關的PostProcessor,之后會調用populateBean方法
8、populateBean這個方法會判斷Bean是否autowire,如果是的話會進行自動注入,最后會調用applyPropertyValues方法,這個方法看名字也很好理解,就是對配置的屬性值進行寫入。到這里這個Bean的構建基本全部完成了,后續就是將Bean寫入緩存Map,注冊單例類等操作。