讀spring源碼(三)-ClassPathXmlApplicationContext-getBean


這次主要看了下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,注冊單例類等操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM