先來看看java中反射機(jī)制:只要給定類的名字就可以通過反射機(jī)制獲取類的所有信息链瓦,實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編譯
https://www.zhihu.com/question/21346206
建議不要硬著頭皮看spring代碼抹竹,如果想學(xué)學(xué)ioc,控制反轉(zhuǎn)這些建議看看jodd項(xiàng)目摄职⌒裱剩基本原理其實(shí)就是通過反射解析類及其類的各種信息裁蚁,包括構(gòu)造器串塑、方法及其參數(shù)舰讹,屬性庵寞。然后將其封裝成bean定義信息類虚汛、constructor信息類、method信息類皇帮、property信息類卷哩,最終放在一個(gè)map里,也就是所謂的container属拾,池等等将谊,其實(shí)就是個(gè)map冷溶。。汗尊浓。逞频。。栋齿。當(dāng)你寫好配置文件苗胀,啟動(dòng)項(xiàng)目后,框架會(huì)先按照你的配置文件找到那個(gè)要scan的包瓦堵,然后解析包里面的所有類,找到所有含有@bean菇用,@service等注解的類惋鸥,利用反射解析它們,包括解析構(gòu)造器卦绣,方法耐量,屬性等等,然后封裝成各種信息類放到一個(gè)map里廊蜒。每當(dāng)你需要一個(gè)bean的時(shí)候蜗搔,框架就會(huì)從container找是不是有這個(gè)類的定義啊聘芜?如果找到則通過構(gòu)造器new出來(這就是控制反轉(zhuǎn)缝龄,不用你new,框架幫你new),再在這個(gè)類找是不是有要注入的屬性或者方法瞎饲,比如標(biāo)有@autowired的屬性炼绘,如果有則還是到container找對(duì)應(yīng)的解析類,new出對(duì)象,并通過之前解析出來的信息類找到setter方法疟呐,然后用該方法注入對(duì)象(這就是依賴注入)东且。如果其中有一個(gè)類container里沒找到珊泳,則拋出異常,比如常見的spring無法找到該類定義色查,無法wire的異常。還有就是嵌套bean則用了一下遞歸涣仿,container會(huì)放到servletcontext里面示惊,每次reQuest從servletcontext找這個(gè)container即可米罚,不用多次解析類定義丈探。如果bean的scope是singleton,則會(huì)重用這個(gè)bean不再重新創(chuàng)建隘竭,將這個(gè)bean放到一個(gè)map里讼渊,每次用都先從這個(gè)map里面找。如果scope是session菱皆,則該bean會(huì)放到session里面挨稿。僅此而已,沒必要花更多精力篷店。建議還是多看看底層的知識(shí)臭家。