Spring的基本功能就是IoC和AOP,咱們的bean都是交給Spring管理的。那麼Spring IoC是怎麼生成這些bean、又怎麼爲指定的bean進行AOP代理加強呢?答案就在Spring的啓動流程中。緩存
爲了方便,這裏使用註解版的寫法來啓動Spring IoC容器。以下圖。ui
這裏先說總結再講解源碼,先理清脈絡再深刻細節纔不會迷失在細節當中。this
如上圖所示,Spring的啓動過程主要能夠分爲兩部分:3d
Bean的生命週期以下圖,先有個印象便可,到源碼部分再回過頭來看看Bean的生命週期。代理
我如今用的是Spring 5.2.6的源碼,Spring全註解版開發。component
第一步就是new一個容器了。cdn
點進去看一下,能夠看到主要有三個方法,請記牢這三個方法,this(); register(componentClasses); refresh();xml
點擊進入this,看到裏層註冊了6個RootBeanDefinition,即系統級別的BeanDefinition。對象
再進去,能夠看到註冊BeanDefinition其實就是放到BeanFactory的緩存中。blog
以ConfigurationClassPostProcessor類爲例,其實它是一個BeanFactoryPostProcessor攔截器。注意,這部分回調的代碼在refresh()中才會執行的。因此下面說的BeanFactoryPostProcessor還不會執行,而是在refresh()中執行。
ConfigurationClassPostProcessor他是攔截配置類並解析裏面的Bean定義的。其攔截方法會檢查該類是不是配置類。
接着解析配置類。
解析@Import和@Bean
這個方法主要就是來註冊new AnnotationConfigApplicationContext(xxxConfiguration.class);傳進來的配置類的。
這是Spring啓動中最重要的方法。點進去看一下。其中invokeBeanFactoryPostProcessor故名思意就是調用BeanFactory後置處理器。registerBeanPostProcessors(beanFactory)註冊bean後置處理器,Bean後置處理器在Spring中應用很普遍,他能Bean建立過程當中的攔截處理器,相似BeanFactoryPostProcessor也是攔截器。
點進這個方法,finishBeanFactoryInitialization(beanFactory)。他是初始化bean的重要方法。bean既能夠經過@Bean來定義,也能夠經過FactoryBean來初始化。
點擊getBean(beanName)看看一個bean是怎麼建立的,同時,這也是Bean的生命週期。
看到createBean(beanName, mbd, args)方法
bean建立過程能夠分爲兩步,實例化Instantiation和初始化Initialization。實例化指的是建立bean實例,初始化指的是爲填充bean實例屬性(爲屬性賦值)。resolveBeforeInstantiation()方法在bean還沒實例化以前執行。提供給Bean後置處理器一個返回代理的機會,當你調用被代理的bean時,其實是執行了加強了的代理對象。
點進去doCreateBean方法。這裏就是bean的生命週期了,如開篇放出的這張圖。
bena什麼週期,能夠看到第一步就建立了實例
點擊該方法createBeanInstance進去,能夠看到最終就是經過Java的反射來建立bean對象的。
點進去initializeBean方法查看,能夠看到和上面生命週期的圖吻合。先檢查Aware接口,再到Bean後置處理器的前置處理方法,接着調用初始化方法。
bean的生命週期
至此,bean的IoC容器功能啓動流程講解結束
Spring代理加強方面,咱們在上面的IoC容器部分看到實例化bean以前,實際上是有先判斷bean是否須要加強,該方法爲resolveBeforeInstantiation(beanName, mdbToUse),注意該方法是在bean實例化以前的,即先判斷是否須要建立代理,若是不須要纔會建立bean,不然建立的是代理對象。
夜深了,待續。明天再謝謝AOP部分的內容。