1.Spring簡(jiǎn)介:
Spring是一個(gè)輕量級(jí)控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架,為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而誕生的
2.控制反轉(zhuǎn):獲得依賴對(duì)象的過程被反轉(zhuǎn)了撇贺,由自身的管理冀惭,變成IOC容器注入
控制反轉(zhuǎn)是Spring的核心堂鲜,就是由Spring來控制對(duì)象的生命周期及對(duì)象間的關(guān)系
1)傳統(tǒng)的開發(fā)模式:對(duì)象之間相互依賴
例如找女朋友筒扒,自己得到處找,從性格鸠踪,外貌丙者,身材等各個(gè)方面去考慮,去尋找
各個(gè)模塊之間相互關(guān)聯(lián)牽一發(fā)而動(dòng)全身
2)IOC開發(fā)模式:IOC容器安排對(duì)象之間的關(guān)系
例如找女朋友的時(shí)候有一個(gè)婚介所营密,你把自己的需求提出來剩下的交給婚介所去安排就好了
把控制權(quán)交給了IOC容器械媒,IOC容器相當(dāng)于凝合劑的作用
互相不相關(guān)
IOC另外的名字叫做依賴注入(DI),所謂的依賴注入评汰,就是IOC容器在運(yùn)行期間纷捞,動(dòng)態(tài)的將某種依賴關(guān)系注入到對(duì)象中,所以依賴注入和控制反轉(zhuǎn)是從不同的角度描述的同一件事情被去,就是通過引入IOC容器主儡,利用依賴注入的方式,實(shí)現(xiàn)解耦惨缆。
對(duì)象相當(dāng)于主機(jī)糜值,各種USB設(shè)備相當(dāng)于關(guān)系丰捷,主機(jī)不需要知道為什么要插入U(xiǎn)SB,只需要識(shí)別USB設(shè)備即可臀玄,“我”來控制插入何種USB設(shè)備膘螟,我就相當(dāng)于IOC容器竿痰,我把USB注入到了主機(jī)吭露。當(dāng)電腦主機(jī)讀取文件的時(shí)候暇屋,我就把它需要的外部設(shè)備掛接上煞抬,掛接設(shè)備的過程混萝,和在系統(tǒng)運(yùn)行過程中一個(gè)被依賴的對(duì)象注入到另一個(gè)對(duì)象的過程是一樣的 狱杰。
對(duì)象A依賴對(duì)象B屹耐,當(dāng)對(duì)象A需要用到對(duì)象B的時(shí)候少漆,IOC容器就立刻創(chuàng)建一個(gè)對(duì)象B給對(duì)象A臼膏。IOC容器相當(dāng)于一個(gè)對(duì)象制造工廠,你需要啥就給你啥示损,不需要關(guān)心所用的東西如何制成的和銷毀的渗磅,這些都由IOC容器來包辦
總結(jié):
IOC通俗理解:說的是創(chuàng)建實(shí)例對(duì)象的控制權(quán)從代碼控制剝離到IOC容器控制,實(shí)際上就是在你的xml文件中控制检访,側(cè)重原理
DI:說的是創(chuàng)建對(duì)象示例始鱼,為這個(gè)對(duì)象注入屬性值和它的對(duì)象實(shí)例,側(cè)重實(shí)現(xiàn)脆贵。
3.面向切面(AOP)
AOP把常用的功能模塊化医清,每一個(gè)業(yè)務(wù)組件只需要關(guān)心自己的業(yè)務(wù)邏輯,而不用去了解常用的服務(wù)組件卖氨。有效的防止代碼混亂
AOP專門用于處理系統(tǒng)中分布于各個(gè)模塊中交叉點(diǎn)關(guān)注的問題会烙,在javaee中通常通過AOP來處理一些具有橫切性質(zhì)的系統(tǒng)級(jí)服務(wù)
切面:關(guān)注點(diǎn)的模塊化,關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象筒捺,
連接點(diǎn):程序在運(yùn)行過程中某個(gè)特定的點(diǎn)柏腻,例如方法調(diào)用的時(shí)候,處理異常的時(shí)候系吭,通俗的說就是加入切點(diǎn)的那個(gè)點(diǎn)
通知:連接點(diǎn)執(zhí)行的動(dòng)作
AOP通俗理解:
一個(gè)組件A五嫂,不關(guān)心其它常用的服務(wù)組件B,但是A要使用組件B的時(shí)候村斟,不是組件A自己去調(diào)用贫导,而是通過配置等其他方式,比如Spring中的xml配置文件蟆盹,這樣A不需要知道組件B的任何事情孩灯,A只關(guān)心自己的業(yè)務(wù)邏輯,具體在A使用B的過程中逾滥,配置文件去做峰档,與具體的A組件無(wú)關(guān)败匹。
自動(dòng)裝配模式的區(qū)別
- no:這是Spring框架的默認(rèn)設(shè)置,在該設(shè)置下自動(dòng)裝配是關(guān)閉的讥巡,開發(fā)者需要自行在bean定義中用標(biāo)簽明確的設(shè)置依賴關(guān)系掀亩。
- byName:該選項(xiàng)可以根據(jù)bean名稱設(shè)置依賴關(guān)系。當(dāng)向一個(gè)bean中自動(dòng)裝配一個(gè)屬性時(shí)欢顷,容器將根據(jù)bean的名稱自動(dòng)在在配置文件中查詢一個(gè)匹配的bean槽棍。如果找到的話,就裝配這個(gè)屬性抬驴,如果沒找到的話就報(bào)錯(cuò)炼七。
- byType:該選項(xiàng)可以根據(jù)bean類型設(shè)置依賴關(guān)系。當(dāng)向一個(gè)bean中自動(dòng)裝配一個(gè)屬性時(shí)布持,容器將根據(jù)bean的類型自動(dòng)在在配置文件中查詢一個(gè)匹配的bean豌拙。如果找到的話,就裝配這個(gè)屬性题暖,如果沒找到的話就報(bào)錯(cuò)按傅。
- constructor:造器的自動(dòng)裝配和byType模式類似,但是僅僅適用于與有構(gòu)造器相同參數(shù)的bean胧卤,如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean唯绍,那么將會(huì)拋出異常。
- autodetect:該模式自動(dòng)探測(cè)使用構(gòu)造器自動(dòng)裝配或者byType自動(dòng)裝配灌侣。首先推捐,首先會(huì)嘗試找合適的帶參數(shù)的構(gòu)造器,如果找到的話就是用構(gòu)造器自動(dòng)裝配侧啼,如果在bean內(nèi)部沒有找到相應(yīng)的構(gòu)造器或者是無(wú)參構(gòu)造器牛柒,容器就會(huì)自動(dòng)選擇byTpe的自動(dòng)裝配方式。
Spring 框架中都用到了哪些設(shè)計(jì)模式
- 代理模式—在AOP和remoting中被用的比較多痊乾。
- 單例模式—在spring配置文件中定義的bean默認(rèn)為單例模式皮壁。
- 模板方法—用來解決代碼重復(fù)的問題 比如. RestTemplate, JmsTemplate, JpaTemplate。 前端控制器—Srping提供了DispatcherServlet來對(duì)請(qǐng)求進(jìn)行分發(fā)哪审。 視圖幫助(View Helper )—Spring提供了一系列的JSP標(biāo)簽蛾魄,高效宏來輔助將分散的代碼整合在視圖里。 依賴注入—貫穿于BeanFactory / ApplicationContext接口的核心理念湿滓。
- 工廠模式—BeanFactory用來創(chuàng)建對(duì)象的實(shí)例滴须。
- Builder模式- 自定義配置文件的解析bean是時(shí)采用builder模式,一步一步地構(gòu)建一個(gè)beanDefinition
- 策略模式:Spring 中策略模式使用有多個(gè)地方叽奥,如 Bean 定義對(duì)象的創(chuàng)建以及代理對(duì)象的創(chuàng)建等扔水。這里主要看一下代理對(duì)象創(chuàng)建的策略模式的實(shí)現(xiàn)。 前面已經(jīng)了解 Spring 的代理方式有兩個(gè) Jdk 動(dòng)態(tài)代理和 CGLIB 代理朝氓。這兩個(gè)代理方式的使用正是使用了策略模式魔市。
Spring事務(wù)的隔離級(jí)別
- ISOLATION_DEFAULT: 這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別主届,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別.
另外四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng) - ISOLATION_READ_UNCOMMITTED: 這是事務(wù)最低的隔離級(jí)別,它充許令外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)待德。
- ISOLATION_READ_COMMITTED: 保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取君丁。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)
- ISOLATION_REPEATABLE_READ: 這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀将宪。但是可能出現(xiàn)幻像讀绘闷。
- ISOLATION_SERIALIZABLE 這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行涧偷。
Spring事務(wù)定義的傳播規(guī)則
PROPAGATION_REQUIRED–支持當(dāng)前事務(wù)簸喂,如果當(dāng)前沒有事務(wù)毙死,就新建一個(gè)事務(wù)燎潮。這是最常見的選擇。
PROPAGATION_SUPPORTS–支持當(dāng)前事務(wù)扼倘,如果當(dāng)前沒有事務(wù)确封,就以非事務(wù)方式執(zhí)行。
PROPAGATION_MANDATORY–支持當(dāng)前事務(wù)再菊,如果當(dāng)前沒有事務(wù)爪喘,就拋出異常。
PROPAGATION_REQUIRES_NEW–新建事務(wù)纠拔,如果當(dāng)前存在事務(wù)秉剑,把當(dāng)前事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED–以非事務(wù)方式執(zhí)行操作稠诲,如果當(dāng)前存在事務(wù)侦鹏,就把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER–以非事務(wù)方式執(zhí)行臀叙,如果當(dāng)前存在事務(wù)略水,則拋出異常。
PROPAGATION_NESTED–如果當(dāng)前存在事務(wù)劝萤,則在嵌套事務(wù)內(nèi)執(zhí)行渊涝。如果當(dāng)前沒有事務(wù),則進(jìn)行與PROPAGATION_REQUIRED類似的操作床嫌。