Spring 簡單描述

摘抄自知乎spring


建議不要硬着頭皮看spring代碼,自己的代碼800多m,就是不上班開始看也不知道何時看完。若是想學學ioc,控制反轉這些建議看看jodd項目,比較簡練,可是我仍然不建議過多的看這些框架的代碼,由於這些代碼要完成任務須要不少瑣碎的類實現,好比讀取某個包下面的全部類,解析class的頭文件,反射各類信息,再加上封裝,頗有可能在讀源碼的過程當中掉到各類細節裏出不來,因此讀這種源碼要事無鉅細,理解原理便可。 基本原理其實就是經過反射解析類及其類的各類信息,包括構造器、方法及其參數,屬性。而後將其封裝成bean定義信息類、constructor信息類、method信息類、property信息類,最終放在一個map裏,也就是所謂的container,池等等,其實就是個map。。汗。。。。當你寫好配置文件,啓動項目後,框架會先按照你的配置文件找到那個要scan的包,而後解析包裏面的全部類,找到全部含有@bean,@service等註解的類,利用反射解析它們,包括解析構造器,方法,屬性等等,而後封裝成各類信息類放到一個map裏。每當你須要一個bean的時候,框架就會從container找是否是有這個類的定義啊?若是找到則經過構造器new出來(這就是控制反轉,不用你new,框架幫你new),再在這個類找是否是有要注入的屬性或者方法,好比標有@autowired的屬性,若是有則仍是到container找對應的解析類,new出對象,並經過以前解析出來的信息類找到setter方法,而後用該方法注入對象(這就是依賴注入)。若是其中有一個類container裏沒找到,則拋出異常,好比常見的spring沒法找到該類定義,沒法wire的異常。還有就是嵌套bean則用了一下遞歸,container會放到servletcontext裏面,每次reQuest從servletcontext找這個container便可,不用屢次解析類定義。若是bean的scope是singleton,則會重用這個bean再也不從新建立,將這個bean放到一個map裏,每次用都先從這個map裏面找。若是scope是session,則該bean會放到session裏面。僅此而已,不必花更多精力。建議仍是多看看底層的知識。
相關文章
相關標籤/搜索