概述
- 什么是Spring?(what)
- 如何使用Spring?(how)
Spring 框架是一個輕量級的框架拘鞋,其核心是IOC(Inversion of Control控制反轉(zhuǎn))和AOP(Aspect Oriented Programming面向切面編程)淤击。
Spring 框架的核心特性可以用于開發(fā)任何 Java 應(yīng)用程序娘荡,但是在 Java EE 平臺上構(gòu)建 web 應(yīng)用程序是需要擴展的估盘。 Spring 框架的目標是使 J2EE 開發(fā)變得更容易使用喷市。
理解什么是Spring?
Spring是一個開源的輕量級Java SE(Java 標準版本)/Java EE(Java 企業(yè)版本)開發(fā)應(yīng)用框架,其目的是用于簡化企業(yè)級應(yīng)用程序開發(fā)酗宋。應(yīng)用程序是由一組相互協(xié)作的對象組成。它的核心是IOC和AOP疆拘。
Spring能幫我們做什么蜕猫?
1.Spring能幫我們根據(jù)配置文件創(chuàng)建及組裝對象之間的依賴關(guān)系。
2.Spring 面向切面編程能幫助我們無耦合的實現(xiàn)日志記錄哎迄,性能統(tǒng)計回右,安全控制。
3.在傳統(tǒng)應(yīng)用程序當中漱挚,我們?nèi)绾蝸硗瓿蓴?shù)據(jù)庫事務(wù)管理翔烁?需要一系列“獲取連接,執(zhí)行SQL旨涝,提交或回滾事務(wù)蹬屹,關(guān)閉連接”,而且還要保證在最后一定要關(guān)閉連接,多么可怕的事情慨默,而且也很無聊贩耐;如果采用Spring,我們只需獲取連接厦取,執(zhí)行SQL潮太,其他的都交給Spring來管理了,簡單吧虾攻。所以铡买,Spring能非常簡單的幫我們管理數(shù)據(jù)庫事務(wù)。
4.Spring還提供了與第三方數(shù)據(jù)訪問框架(如Hibernate霎箍、JPA)無縫集成奇钞,而且自己也提供了一套JDBC訪問模板,來方便數(shù)據(jù)庫訪問朋沮。
5.Spring還提供與第三方Web(如Struts蛇券、JSF)框架無縫集成,而且自己也提供了一套Spring MVC框架樊拓,來方便web層搭建纠亚。
6.Spring能方便的與Java EE(如Java Mail、任務(wù)調(diào)度)整合筋夏,與更多技術(shù)整合(比如緩存框架)蒂胞。
使用Spring,必須先對IOC容器有一個透徹的了解,以及如何配置及使用容器条篷,其他所有技術(shù)都是基于容器實現(xiàn)骗随。理解好IoC后,接下來是面向切面編程赴叹,首先還是明確概念鸿染,基本配置,最后是實現(xiàn)原理乞巧,接下來就是數(shù)據(jù)庫事務(wù)管理涨椒,其實Spring管理事務(wù)是通過面向切面編程實現(xiàn)的,所以基礎(chǔ)很重要绽媒,IoC容器和面向切面編程搞定后蚕冬,其余都是基于這倆東西的實現(xiàn)
IoC是什么?
Ioc—Inversion of Control,即“控制反轉(zhuǎn)”是辕,是一種設(shè)計思想囤热。在Java開發(fā)中,Ioc意味著將你設(shè)計好的對象交給容器控制获三,而不是傳統(tǒng)的在你的對象內(nèi)部直接控制旁蔼。如何理解好Ioc呢锨苏?理解好Ioc的關(guān)鍵是要明確“誰控制誰,控制什么牌芋,為何是反轉(zhuǎn)(有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn)了)蚓炬,哪些方面反轉(zhuǎn)了”,那我們來深入分析一下:
●誰控制誰躺屁,控制什么:傳統(tǒng)Java SE程序設(shè)計肯夏,我們直接在對象內(nèi)部通過new進行創(chuàng)建對象,是程序主動去創(chuàng)建依賴對象犀暑;而IoC是有專門一個容器來創(chuàng)建這些對象驯击,即由Ioc容器來控制對象的創(chuàng)建;誰控制誰耐亏?當然是IoC 容器控制了對象徊都;控制什么?那就是主要控制了外部資源獲裙愠健(不只是對象包括比如文件等)暇矫。
●為何是反轉(zhuǎn),哪些方面反轉(zhuǎn)了:有反轉(zhuǎn)就有正轉(zhuǎn)择吊,傳統(tǒng)應(yīng)用程序是由我們自己在對象中主動控制去直接獲取依賴對象李根,也就是正轉(zhuǎn);而反轉(zhuǎn)則是由容器來幫忙創(chuàng)建及注入依賴對象几睛;為何是反轉(zhuǎn)房轿?因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象所森,所以是反轉(zhuǎn)囱持;哪些方面反轉(zhuǎn)了?依賴對象的獲取被反轉(zhuǎn)了焕济。
IoC能做什么
IoC不是一種技術(shù)纷妆,只是一種思想,一個重要的面向?qū)ο缶幊痰姆▌t晴弃,它能指導(dǎo)我們?nèi)绾卧O(shè)計出松耦合凭需、更優(yōu)良的程序。傳統(tǒng)應(yīng)用程序都是由我們在類內(nèi)部主動創(chuàng)建依賴對象肝匆,從而導(dǎo)致類與類之間高耦合,難于測試顺献;有了IoC容器后旗国,把創(chuàng)建和查找依賴對象的控制權(quán)交給了容器,由容器進行注入組合對象注整,所以對象與對象之間是松散耦合能曾,這樣也方便測試度硝,利于功能復(fù)用,更重要的是使得程序的整個體系結(jié)構(gòu)變得非常靈活寿冕。
其實IoC對編程帶來的最大改變不是從代碼上蕊程,而是從思想上,發(fā)生了“主從換位”的變化驼唱。應(yīng)用程序原本是老大藻茂,要獲取什么資源都是主動出擊,但是在IoC/DI思想中玫恳,應(yīng)用程序就變成被動的了辨赐,被動的等待IoC容器來創(chuàng)建并注入它所需要的資源了。
IoC很好的體現(xiàn)了面向?qū)ο笤O(shè)計法則之一—— 好萊塢法則:“別找我們京办,我們找你”掀序;即由IoC容器幫對象找相應(yīng)的依賴對象并注入,而不是由對象主動去找惭婿。
IoC和DI
DI—Dependency Injection不恭,即“依賴注入”:是組件之間依賴關(guān)系由容器在運行期決定,形象的說财饥,即由容器動態(tài)的將某個依賴關(guān)系注入到組件之中换吧。依賴注入的目的并非為軟件系統(tǒng)帶來更多功能,而是為了提升組件重用的頻率佑力,并為系統(tǒng)搭建一個靈活式散、可擴展的平臺。通過依賴注入機制打颤,我們只需要通過簡單的配置暴拄,而無需任何代碼就可指定目標需要的資源,完成自身的業(yè)務(wù)邏輯编饺,而不需要關(guān)心具體的資源來自何處乖篷,由誰實現(xiàn)。
理解DI的關(guān)鍵是:“誰依賴誰透且,為什么需要依賴撕蔼,誰注入誰,注入了什么”秽誊,那我們來深入分析一下:
●誰依賴于誰:當然是應(yīng)用程序依賴于IoC容器鲸沮;
●為什么需要依賴:應(yīng)用程序需要IoC容器來提供對象需要的外部資源;
●誰注入誰:很明顯是IoC容器注入應(yīng)用程序某個對象锅论,應(yīng)用程序依賴的對象讼溺;
●注入了什么:就是注入某個對象所需要的外部資源(包括對象、資源最易、常量數(shù)據(jù))怒坯。
IoC和DI由什么關(guān)系呢炫狱?其實它們是同一個概念的不同角度描述,由于控制反轉(zhuǎn)概念比較含糊(可能只是理解為容器控制對象這一個層面剔猿,很難讓人想到誰來維護對象關(guān)系)视译,所以2004年大師級人物Martin Fowler又給出了一個新的名字:“依賴注入”,相對IoC 而言归敬,“依賴注入”明確描述了“被注入對象依賴IoC容器配置依賴對象”酷含。
AOP的基本概念:
連接點(Jointpoint):表示需要在程序中插入橫切關(guān)注點的擴展點,連接點可能是類初始化弄慰、方法執(zhí)行第美、方法調(diào)用、字段調(diào)用或處理異常等等陆爽,Spring只支持方法執(zhí)行連接點什往,在AOP中表示為“在哪里干”;
切入點(Pointcut):選擇一組相關(guān)連接點的模式慌闭,即可以認為連接點的集合别威,Spring支持perl5正則表達式和AspectJ切入點模式,Spring默認使用AspectJ語法驴剔,在AOP中表示為“在哪里干的集合”省古;(選取我們所需要的連接點的集合);
通知(Advice):在連接點上執(zhí)行的行為丧失,通知提供了在AOP中需要在切入點所選擇的連接點處進行擴展現(xiàn)有行為的手段豺妓;包括前置通知(before advice)、后置通知(after advice)布讹、環(huán)繞通知(around advice)琳拭,在Spring中通過代理模式實現(xiàn)AOP,并通過攔截器模式以環(huán)繞連接點的攔截器鏈織入通知描验;在AOP中表示為“干什么”白嘁;通知說明了干什么和什么時候干(什么時候通過方法名中的befor,after膘流,around等就能知道)
方面/切面(Aspect):橫切關(guān)注點的模塊化絮缅,比如上邊提到的日志組件『艄桑可以認為是通知耕魄、引入和切入點的組合;在Spring中可以使用Schema和@AspectJ方式進行組織實現(xiàn)彭谁;在AOP中表示為“在哪干和干什么集合”吸奴;切面=切入點+通知
引入(inter-type declaration):也稱為內(nèi)部類型聲明,為已有的類添加額外新的字段或方法,Spring允許引入新的接口(必須對應(yīng)一個實現(xiàn))到所有被代理對象(目標對象), 在AOP中表示為“干什么(引入什么)”奄抽;
目標對象(Target Object):需要被織入橫切關(guān)注點的對象,即該對象是切入點選擇的對象甩鳄,需要被通知的對象逞度,從而也可稱為“被通知對象”;由于Spring AOP 通過代理模式實現(xiàn)妙啃,從而這個對象永遠是被代理對象档泽,在AOP中表示為“對誰干”;
AOP代理(AOP Proxy):AOP框架使用代理模式創(chuàng)建的對象揖赴,從而實現(xiàn)在連接點處插入通知(即應(yīng)用切面)馆匿,就是通過代理來對目標對象應(yīng)用切面。在Spring中燥滑,AOP代理可以用JDK動態(tài)代理或CGLIB代理實現(xiàn)渐北,而通過攔截器模型應(yīng)用切面。
織入(Weaving):織入是一個過程铭拧,是將切面應(yīng)用到目標對象從而創(chuàng)建出AOP代理對象的過程赃蛛,織入可以在編譯期、類裝載期搀菩、運行期進行呕臂。
基于Schema的AOP
基于Schema的AOP從Spring2.0之后通過“aop”命名空間來定義切面、切入點及聲明通知肪跋。
在Spring配置文件中歧蒋,所以AOP相關(guān)定義必須放在<aop:config>標簽下,該標簽下可以有<aop:pointcut>州既、<aop:advisor>谜洽、<aop:aspect>標簽,配置順序不可變易桃。
<aop:pointcut>:用來定義切入點褥琐,該切入點可以重用;
<aop:advisor>:用來定義只有一個通知和一個切入點的切面晤郑;
<aop:aspect>:用來定義切面敌呈,該切面可以包含多個切入點和通知,而且標簽內(nèi)部的通知和切入點定義是無序的造寝;和advisor的區(qū)別就在此磕洪,advisor只包含一個通知和一個切入點。
以上內(nèi)容參考鏈接:
spring和springMVC的面試問題總結(jié)
使用 Java 配置進行 Spring bean 管理
史上最簡單的 SpringCloud 教程 | 終章
IoC是什么
Spring教程
極客學(xué)院團隊出品-spring教程
spring-官方網(wǎng)站