1. 程式人生 > >spring基本原理

spring基本原理

blog 解析包 而已 post 反射 wire 常見 異常 創建

作者:王奕然
鏈接:https://www.zhihu.com/question/21346206/answer/101789659
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

基本原理其實就是通過反射解析類及其類的各種信息,包括構造器、方法及其參數,屬性。然後將其封裝成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裏面。僅此而已,

spring基本原理