javascript
简述Spring技术内幕
相信任何一個(gè)開發(fā)者都使用過Spring這個(gè)框架,或許你剛開始使用Spring、或許你有看過源碼解析系列文章、或許你曾調(diào)試過源碼、或許你。。。總之不管你的情況如何,你有想過自己實(shí)現(xiàn)一個(gè)Spring框架么?本篇文章就就來簡單描述一下Spring中的IOC、MVC、AOP都是如何實(shí)現(xiàn)的
IOC
1. 加載配置
早期的Spring框架關(guān)于bean的定義都是配置在xml文件中的,就算是現(xiàn)在有了Service、Controller等注解、有了SpringBoot號稱減少大部分配置,但是關(guān)于數(shù)據(jù)庫的等相關(guān)信息也是存在于配置文件的。所以作為框架來說加載配置文件是必不可少的功能。
2. 類加載器
首先通過上一步我們獲取到了xml中定義的bean,以及包掃描的路徑,根據(jù)獲取的這兩種配置我們就需要把這些bean實(shí)例化出來。怎么去實(shí)例化呢,分為兩個(gè)步驟:
3. Bean容器
通過第二步我們已經(jīng)知道了哪些類需要被Spring來管理,那么現(xiàn)在我們就可以通過反射來把set集合中的類實(shí)例化出來,實(shí)例化出來的這些類我們統(tǒng)一把它們放到一個(gè)全局的靜態(tài)Map中。
4. 依賴注入
我們知道使用IOC最直觀的一個(gè)表現(xiàn)就是我們使用的對象不用自己new了,那么這個(gè)功能是如何實(shí)現(xiàn)的呢?
想想我們現(xiàn)在使用的自動(dòng)注入,是不是自動(dòng)注入的變量都會(huì)使用@Resource和@Autowired來標(biāo)示呢。簡單來說,在第三步所有的Bean都實(shí)例化以后,我們需要遍歷所有Map中的實(shí)例,通過反射獲取實(shí)例的所有屬性,當(dāng)有屬性上方有剛才提到的兩個(gè)注解時(shí)就去Map中尋找對應(yīng)的實(shí)例來進(jìn)行賦值。這樣當(dāng)把Map遍歷完畢以后依賴注入的功能也就完成了。
AOP
寫一個(gè)AOP框架需要一個(gè)前提,那就是你需要懂代理模式。
獲取所有需要被攔截的方法或類,然后根據(jù)增強(qiáng)類型通過動(dòng)態(tài)代理模式為這些方法或類生成代理對象,然后把代理對象放入到SpringIOC管理的Map中。
MVC
1. MVCBean容器
我們知道@Controller注解是標(biāo)志著一個(gè)類是用于處理MVC請求的,這樣的話我們就可以在實(shí)現(xiàn)IOC功能實(shí)例化類的時(shí)候把所有帶有@Controller注解的類復(fù)制一份放在一個(gè)MVCBean容器當(dāng)中。
2. 建立請求映射關(guān)系
僅僅只有一個(gè)MVCBean容器是不夠的,還有一個(gè)@RequestMapping注解也是必須用到的,我們應(yīng)該把所有帶有@RequestMapping注解的方法的請求路徑、請求方式、請求參數(shù)、實(shí)例名、方法名都記錄下來。這樣當(dāng)一個(gè)請求過來以后根據(jù)請求路徑、方式和參數(shù)定義到實(shí)例的方法,然后通過反射來調(diào)用這個(gè)方法。
3. 返回值處理
我們知道有的方法返回的是一個(gè)view而有的方法返回的是json數(shù)據(jù),這種情況就得根據(jù)方法是是否含有@ResponseBody注解來判斷,如果沒有此注解就在反射調(diào)用方法完畢后通知瀏覽器跳轉(zhuǎn)到結(jié)果路徑、如果包含此注解的話就需要序列化json數(shù)據(jù)寫入HttpServletResponse從而輸出到瀏覽器。
轉(zhuǎn)載于:https://juejin.im/post/5c943761e51d456f0b578c82
總結(jié)
以上是生活随笔為你收集整理的简述Spring技术内幕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8148和8127中的ezsdk和dvr
- 下一篇: gradle idea java ssm