1、Spring簡介
2、Spring特色
3、Spring與IoC
原文連接:https://www.cnblogs.com/wangbin2188/p/9013765.htmlhtml
Spring 是於2003 年興起的一個輕量級的Java 開發框架,它是爲了解決企業應用開發的複雜性而建立的。Spring的核心是控制反轉(IoC)和麪向切面編程(AOP)。簡單來講,Spring是一個分層的Java SE/EE full-stack(一站式) 輕量級開源框架。編程
Spring框架體系結構:
Spring由20多個模塊組成,它們能夠分爲數據訪問/集成(Data Access/Integration)、Web、面向切面編程(AOP, Aspects)、應用服務器設備管理(Instrumentation)、消息發送(Messaging)、核心容器(Core Container)和測試(Test)segmentfault
一、非侵入式
所謂非侵入式是指,Spring框架的API不會在業務邏輯上出現,即業務邏輯是POJO(Plain Old Java Objects)。因爲業務邏輯中沒有Spring的API,因此業務邏輯能夠從Spring框架快速的移植到其餘框架,即與環境無關。設計模式
二、容器
Spring做爲一個容器,能夠管理對象的生命週期、對象與對象之間的依賴關係。能夠經過配置文件,來定義對象,以及設置與其餘對象的依賴關係。安全
三、IoC
控制反轉(Inversion of Control),即建立被調用者的實例不是由調用者完成,而是由Spring容器完成,並注入調用者。
當應用了IoC,一個對象依賴的其它對象會經過被動的方式傳遞進來,而不是這個對象本身建立或者查找依賴對象。即,不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。服務器
四、AOP
面向切面編程(AOP,Aspect Orient Programming),是一種編程思想,是面向對象編程OOP的補充。不少框架都實現了對AOP編程思想的實現。Spring也提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如日誌和事務管理)進行開發。應用對象只實現它們應該作的——完成業務邏輯——僅此而已。它們並不負責其它的系統級關注點,例如日誌或事務支持。
咱們能夠把日誌、安全、事務管理等服務理解成一個「切面」,那麼之前這些服務一直是直接寫在業務邏輯的代碼當中的,這有兩點很差:首先業務邏輯不純淨;其次這些服務被不少業務邏輯反覆使用,徹底能夠剝離出來作到複用。那麼AOP就是這些問題的解決方案,能夠把這些服務剝離出來造成一個「切面」,以期複用,而後將「切面」動態的「織入」到業務邏輯中,讓業務邏輯可以享受到此「切面」的服務。架構
控制反轉(IOC,Inversion of Control),是一個概念,是一種思想。框架
指將傳統上由程序代碼直接操控的對象調用權交給容器,經過容器來實現對象的裝配和管理。控制反轉就是對對象控制權的轉移,從程序代碼自己反轉到了外部容器。分佈式
可是,須要注意,IoC也是有侷限性的,其不能使用在分佈式系統中。即其所依賴的反轉到的外部容器,必需要與控制權出讓方同處於一個JVM中。
IoC是一個概念,是一種思想,其實現方式多種多樣。當前比較流行的實現方式有兩種:依賴注入和依賴查找。依賴注入方式應用更爲普遍。
. 依賴查找:Dependency Lookup,DL,容器提供回調接口和上下文環境給組件,程序代碼則須要提供具體的查找方式。比較典型的是依賴於JNDI系統的查找。
. 依賴注入:Dependency Injection,DI,程序代碼不作定位查詢,這些工做由容器自行完成。
依賴注入DI是指程序運行過程當中,若須要調用另外一個對象協助時,無須在代碼中建立被調用者,而是依賴於外部容器,由外部容器建立後傳遞給程序。
Spring的依賴注入對調用者與被調用者幾乎沒有任何要求,徹底支持POJO之間依賴關係的管理。
依賴注入是目前最優秀的解耦方式。依賴注入讓Spring的Bean之間以配置文件的方式組織在一塊兒,而不是以硬編碼的方式耦合在一塊兒的。測試
Spring DI = 工廠 + 反射 + 配置文件
傳統開發中的面向抽象編程,調用者與接口實現類是緊密耦合在一塊兒的。若實現類發生改變,則必須修改原有代碼:在調用者類中將實現類進行更換。但,這不符合軟件開發的OCP原則(OCP,Open-Close Principle)。
OCP原則,即開閉原則,指軟件實體(類、模塊、功能等)應該能夠被擴展,但不可被修改。即對功能擴展是開放的,對已有代碼修改是關閉的。也就是說,應該在不修改現有代碼的基礎上,擴展新功能。
若要使調用者類與接口實現類之間實現解耦,可以使用工廠模式。但,這又使調用者與工廠耦合,工廠與接口實現類耦合。實現類的更換,不須要修改調用者類,但須要修改工廠,即代碼仍需從新編譯。
此時,能夠經過在工廠類中使用「反射 + 配置文件」的方式來加載接口實現類。而這就是Spring的IoC的工做原理。
舉例:common
Step1:建立一個Java Project
Step2:建立Service層接口IStudentService
Step3:建立接口實現類StudentServiceImpl
Step4:建立Dao層接口IStudentDao
Step5:建立接口實現類StudentDaoImpl
Step6:編寫測試類MyTest
舉例:factory
Step1:複製common項目,改名爲factory
Step2:建立工廠類ServiceFactory 與DaoFactory
Step3:修改MyTest中Service的獲取方式
Step4:修改StdentServiceImpl中Dao的獲取方式
舉例:reflect
Step1:複製factory項目,改名爲reflect
Step2:修改Service工廠類:使用反射建立Service實現類對象
Step3:修改Dao工廠類:使用反射建立Dao實現類對象