引子java
很早以前聽同事說:「要開會了。我都知道領導要問什麼,就那幾板斧。」其實領導之因此爲領導,人家問的問題確實很合情合理,甚至能夠說一針見血。而之因此能問出來這些合理的問題,就是由於頭腦中有本身的思考框架。好比要作一件事情,一個思考框架就是:程序員
1,咱們如今是什麼樣的?web
2,咱們要作成什麼樣(解決什麼問題、有什麼收益)?spring
3,怎麼才能達成(解決路徑)?編程
根據這個思考框架,開會的時候,給領導作彙報,一上來就說我作了什麼什麼。領導天然要問:「作這件事情有什麼收益?」 若是一項任務指標特別好,領導就要問了:「那咱們是怎麼作到的呢?」
這種框架式自上而下的思考習慣,對作任何事情都會有幫助。好比想學習Spring,就先問本身3個問題:框架
1,出現Spring以前是什麼樣子?工具
2,Spring的目標是什麼?學習
3,Spring是怎麼作到的呢?設計
出現Spring以前是什麼樣子3d
出現Spring以前,MVC這種設計典範已經開始興起。在顯示層、模型層和控制層都有了一些工具的支持。好比顯示層有JQuery+JSON,模型層有ibatis,控制層有Struts。開發人員的主要精力應該放到業務邏輯的開發。可是開發前須要作一件事情:將MVC須要的這些東西組裝起來。每一個人在新搭建一個工程時都須要進行組裝。那有沒有一個東西把開發人員須要的東西都弄好了,開發人員只須要將精力用戶業務邏輯開發呢?Spring就是爲了解決這個問題而生。
Spring的目標是什麼
Spring就是要最大限度的簡化開發工做,讓開發人員集中精力於本身的業務邏輯,也是DDD領域驅動開發。
Spring是怎麼作到的呢
核心問題解決
1,解耦
開發人員但願聚焦DDD的開發,首先要解決的事情是我修改一個業務代碼,不但願顯示層、模型層和控制層都要改。不但願改一個類,依賴它的類也須要改。Spring爲了應對這個問題使用了控制反轉的理念。將全部的依賴都由框架注入到一個上下文環境中(DI)。在這個環境中,Bean之間能夠自由的使用。
2,複用
有了DI(依賴注入)的支持,開發人員能夠具體聚焦DDD的開發了。一個優秀程序員的最大的美德是懶惰。一些邏輯,好比日誌,鑑權,不少地方都須要用到。這個業務邏輯關係又不是很緊密,代碼基本上就是拷貝一下。那怎麼能將這些業務特色不強的邏輯從開發人員的工做中剔除掉呢?這就用到了AOP(面向切面)編程。以上Spring要解決的核心問題解耦和複用的解決方案就是Spring的核心:控制反轉、依賴注入和AOP。
核心功能實現
爲了將Spring的核心功能實現出來,就須要用到Robert Martin提出的SOLID原則。分別是單一職責、開放封閉、里氏替換、接口隔離和依賴倒置。控制反轉、依賴注入和AOP,分別對應了三個spring的jar包:spring-beans、spring-context、spring-aop。每一個包單一的負責一個核心功能的實現。這些都須要先作對象的實例化,這個功能由spring-core這個jar包來實現。在Spring-beans中,Spring使用工廠模式來管理程序中使用的對象Bean。每一個Bean實例以BeanDefinition的形式被建立,經過java的反射機制將須要初始化的字段寫入,最終保存在BeanDefinitionMap中。這整個過程由容器來實現,完成了控制反轉。有了控制反轉,開發者能夠經過調用getBean獲取到所須要的對象。spring-context提供文件列表的讀入,將全部依賴的Bean放到一個Context中,就是常說的依賴注入。AOP的主要做用是不經過修改源代碼的方式將功能代碼織入來實現對方法的加強。實現的關鍵在於使用了代理模式。代理主要分爲靜態代理和動態代理。靜態代理最簡單的實現就是建立一個代理類,將對象new出來以後,在調用方法先後都加上代碼。調用方調用代理類而不直接調用原始類。動態代理主要是JDK動態代理和Cglib動態代理,這裏就不詳細展開了。
總結
本文從技術上,只介紹了Spring框架部分的核心功能。你們能夠按照這個思路繼續將其餘部分歸入體系。固然,本文用的思考框架也只是思考框架的一種,是偏產品化的一個視角。徹底能夠用偏技術化的視角好比:「是什麼、爲何、怎麼辦」的思考框架,只要保持一個風格、梳理成體系就好。以上Spring相關的部分,用一張圖總結以下
溫故知新