以下分析基於spring-framework-5.0.x,關於源碼可以自行去github上下載
java中描述對象的我們稱為類class,spring 中描述對象的信息的包括元數據信息,注解信息的我們稱為bean.
我們通過分析spring源碼一步一步解析:
先發一個整體模型圖
首先我們編寫一個啟動類:AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Appconfig.class);
二、我們可以看到上面已經完成了beanFactory的創建、beanDefinitionReader的創建、ClassPathBeanDefinitionScanner的創建、register也即AnnotationConfigApplicationContext。接着我們進去register(annotatedClasses);這個方法看:
//注冊單個bean給容器 比如有新加的類可以用這個方法 但是注冊注冊之后需要手動調用refresh方法去觸發容器解析注解有兩個意思 他可以注冊一個配置類 他還可以單獨注冊一個bean
this.reader.register(annotatedClasses)->registerBean(annotatedClass)->doRegisterBean(annotatedClass, null, null, null);
三、我們可以看到上面完成了對單個或多個普通類或者配置類的解析並注冊到了beanDefinition的map中,這個map很重要后續工廠實例化bean的信息都來自這里。接着我們看refresh()這個方法
這個方法做的功能會比較多。比較簡單的就直接看代碼和注釋理解 和上面一樣我們重點分析關鍵方法
首先我們看下prepareBeanFactory這個方法:
beanFactory:bean工廠,可以產生bean
factoryBean:一個特殊的bean,當我們需要把一個bean手動加入spring管理時,然而加入的bean內部存在許多其他的依賴,我們一般不能直接改引入bean的代碼給他加上@Compenent(因為有可能是jar),也不方便使用@config或者xml去手動配置所有的bean信息即他們之間的相互依賴關系。這時候我們可以通過實現這個factoryBean完成對三方插件的引入spring管理(三方插件內部的其他依賴由三方自己維護)。如sqlsessionFactoryBean。
doScan:通過解析注解中的路徑,找到路徑下的.class文件,然后根據Class.forName生成class分析class中是否有依賴注入的注解如(@Component)等,有的話就通過字節碼文件newInstance生成一個實例。
link:https://blog.csdn.net/nuomizhende45/article/details/81158383