以下我的個(gè)人理解加上網(wǎng)絡(luò)上的所查閱資料,對(duì)于spring框架的一些總結(jié),不足之處還望指出
spring的兩大核心思想就是IOC(控制反轉(zhuǎn))+DI(依賴注入),AOP(面向切面編程)。
? ??什么是控制反轉(zhuǎn)(IOC)
????有控制反轉(zhuǎn)就會(huì)有控制正轉(zhuǎn),正轉(zhuǎn)就是需要用到這個(gè)類對(duì)象時(shí),自己手動(dòng)new出來。而反轉(zhuǎn)就是你設(shè)計(jì)編寫好的類不是由你自己創(chuàng)建,而是把創(chuàng)建的權(quán)力交予spring框架的IOC容器。
? ? 什么是依賴注入(DI)
? ? IOC會(huì)看你的對(duì)象創(chuàng)建是否要依賴于另一個(gè)對(duì)象,(當(dāng)然,這需要你在配置文件中配置),IOC容器會(huì)把你需要的類對(duì)象和該類對(duì)象所依賴的所有類對(duì)象都創(chuàng)建并且注入,這就是依賴注入。依賴注入提倡接口編程,在項(xiàng)目啟動(dòng)的時(shí)候,spring會(huì)根據(jù)你的配置文件創(chuàng)建所需要的類放入IOC容器中,我們只需要通過spring規(guī)定的方式獲取。
? ? 什么是面向切面編程(AOP)
????在傳統(tǒng)的業(yè)務(wù)處理代碼中,通常都會(huì)進(jìn)行事務(wù)處理、日志記錄等操作。雖然使用OOP可以通過組合或者繼承的方式來達(dá)到代碼的重用,但如果要實(shí)現(xiàn)某個(gè)功能(如日志記錄),同樣的代碼仍然會(huì)分散到各個(gè)方法中。這樣,如果想要關(guān)閉某個(gè)功能,或者對(duì)其進(jìn)行修改,就必須要修改所有的相關(guān)方法。這不但增加了開發(fā)人員的工作量,而且提高了代碼的出錯(cuò)率。
????為了解決這一問題,AOP思想隨之產(chǎn)生。AOP是Spring框架面向切面的編程思想,AOP采用一種稱為“橫切”的技術(shù),將涉及多業(yè)務(wù)流程的通用功能抽取并單獨(dú)封裝,形成獨(dú)立的切面,在合適的時(shí)機(jī)將這些切面橫向切入到業(yè)務(wù)流程指定的位置中。Spring框架的AOP機(jī)制可以讓開發(fā)者把業(yè)務(wù)流程中的通用功能抽取出來,單獨(dú)編寫功能代碼。在業(yè)務(wù)流程執(zhí)行過程中,Spring框架會(huì)根據(jù)業(yè)務(wù)流程要求,自動(dòng)把獨(dú)立編寫的功能代碼切入到流程的合適位置。
????AOP是面向切面的編程,其編程思想是把散布于不同業(yè)務(wù)但功能相同的代碼從業(yè)務(wù)邏輯中抽取出來,封裝成獨(dú)立的模塊,這些獨(dú)立的模塊被稱為切面,切面的具體功能方法被稱為關(guān)注點(diǎn)。在業(yè)務(wù)邏輯執(zhí)行過程中,AOP會(huì)把分離出來的切面和關(guān)注點(diǎn)動(dòng)態(tài)切入到業(yè)務(wù)流程中,這樣做的好處是提高了功能代碼的重用性和可維護(hù)性。
? ? 以下是AOP的一些相關(guān)術(shù)語
● Aspect:表示切面。切入業(yè)務(wù)流程的一個(gè)獨(dú)立模塊。
● Join point:表示連接點(diǎn)。也就是業(yè)務(wù)流程在運(yùn)行過程中需要插入切面的具體位置。
● Advice:表示通知。是切面的具體實(shí)現(xiàn)方法??煞譃榍爸猛ㄖ˙efore)、后置通知(AfterReturning)、異常通知(AfterThrowing)、最終通知(After)和環(huán)繞通知(Around)五種。實(shí)現(xiàn)方法具體屬于哪類通知,是在配置文件和注解中指定的。
● Pointcut:表示切入點(diǎn)。用于定義通知應(yīng)該切入到哪些連接點(diǎn)上,不同的通知通常需要切入到不同的連接點(diǎn)上。
● Target:表示目標(biāo)對(duì)象。被一個(gè)或者多個(gè)切面所通知的對(duì)象。
● Proxy:表示代理對(duì)象。將通知應(yīng)用到目標(biāo)對(duì)象之后被動(dòng)態(tài)創(chuàng)建的對(duì)象。可以簡單地理解為,代理對(duì)象為目標(biāo)對(duì)象的業(yè)務(wù)邏輯功能加上被切入的切面所形成的對(duì)象。
● Weaving:表示切入,也稱為織入。將切面應(yīng)用到目標(biāo)對(duì)象從而創(chuàng)建一個(gè)新的代理對(duì)象的過程。這個(gè)過程可以發(fā)生在編譯期、類裝載期及運(yùn)行期。
????
????總結(jié)
一:
????spring思想是將應(yīng)用程序的主動(dòng)性改為被動(dòng)性,以前我們需要用到什么類,應(yīng)用就自己new什么類,感覺應(yīng)用程序是老大,但是,正是如此,類于類之間的耦合度就會(huì)越來越高,不方便測(cè)試。程序中的每一個(gè)類變得不可分割。而spring的出現(xiàn)改變了這種狀態(tài),它通過IOC與DI思想,將創(chuàng)建的權(quán)力交給IOC,注入的問題交給DI,我們根本不需要考慮什么時(shí)候new這個(gè)類對(duì)象,我們只需要在applicationContext.xml中配置bean,通過注入的方式,注入給類中的屬性就行了。正是因?yàn)檫@種特性思想,我們可以將它于持久層框架和控制層框架一起整合,把controller類,mapper接口,service類,action類,dao類等等都交給spring管理,
????例如:前臺(tái)發(fā)送請(qǐng)求----->控制層接收請(qǐng)求----->根據(jù)url在IOC容器中找到相應(yīng)的controller類和方法------>controller類中又依賴注入了service類----->controller再調(diào)用service類----->service類中又依賴注入了dao類----->dao類再對(duì)數(shù)據(jù)庫進(jìn)行操作后----->將操作結(jié)果返回給service類----->service類返回給controller類----->controller類再返回給瀏覽器。
????這樣前后臺(tái)交互就完成了,然而,在這期間我們并沒有new 任何的controller類,service類,dao類,通通是spring創(chuàng)建的,我們只是被動(dòng)的使用它就行了。這大大降低了程序的耦合度。
二:
(1)AOP的編程思想,其主要思想是讓開發(fā)者把諸多業(yè)務(wù)流程中的通用功能抽取出來,單獨(dú)編寫功能代碼,形成獨(dú)立的模塊,這些模塊也被稱為切面。在業(yè)務(wù)流程執(zhí)行過程中,Spring框架會(huì)根據(jù)業(yè)務(wù)流程要求,自動(dòng)把切面切入到流程的合適位置。
(2)AOP的實(shí)現(xiàn)過程,具體實(shí)現(xiàn)步驟是:首先編寫需要切入業(yè)務(wù)流程的獨(dú)立模塊(也稱為切面)和切入點(diǎn)(模塊中的方法);然后在Spring配置文件中配置AOP,添加切入面、切入點(diǎn)以及需要切入的目標(biāo)Bean;最后編寫測(cè)試代碼。