這篇文章主要介紹了Spring框架的小技巧,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
站在用戶的角度思考問題,與客戶深入溝通,找到玉屏網(wǎng)站設(shè)計(jì)與玉屏網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋玉屏地區(qū)。Spring框架在面試中是一個(gè)必問點(diǎn),里面究竟有哪些內(nèi)容呢?讓我們一起來看看。這也是我在面試中經(jīng)常會(huì)問到的問題,也是體現(xiàn)一個(gè)程序員對(duì)框架理解的能力。
Spring是一種輕量級(jí)框架,旨在提高開發(fā)人員的開發(fā)效率以及系統(tǒng)的可維護(hù)性。
我們一般說的Spring框架就是Spring Framework,它是很多模塊的集合,使用這些模塊可以很方便地協(xié)助我們進(jìn)行開發(fā)。這些模塊是核心容器、數(shù)據(jù)訪問/集成、Web、AOP(面向切面編程)、工具、消息和測(cè)試模塊。比如Core Container中的Core組件是Spring所有組件的核心,Beans組件和Context組件是實(shí)現(xiàn)IOC和DI的基礎(chǔ),AOP組件用來實(shí)現(xiàn)面向切面編程。
Spring的6個(gè)特征:
下圖對(duì)應(yīng)的是Spring 4.x的版本,目前最新的5.x版本中Web模塊的Portlet組件已經(jīng)被廢棄掉,同時(shí)增加了用于異步響應(yīng)式處理的WebFlux組件。
IOC(Inversion Of Controll,控制反轉(zhuǎn))是一種設(shè)計(jì)思想,就是將原本在程序中手動(dòng)創(chuàng)建對(duì)象的控制權(quán),交由給Spring框架來管理。IOC在其他語言中也有應(yīng)用,并非Spring特有。IOC容器是Spring用來實(shí)現(xiàn)IOC的載體,IOC容器實(shí)際上就是一個(gè)Map(key, value),Map中存放的是各種對(duì)象。
將對(duì)象之間的相互依賴關(guān)系交給IOC容器來管理,并由IOC容器完成對(duì)象的注入。這樣可以很大程度上簡(jiǎn)化應(yīng)用的開發(fā),把應(yīng)用從復(fù)雜的依賴關(guān)系中解放出來。IOC容器就像是一個(gè)工廠一樣,當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要配置好配置文件/注解即可,完全不用考慮對(duì)象是如何被創(chuàng)建出來的。在實(shí)際項(xiàng)目中一個(gè)Service類可能由幾百甚至上千個(gè)類作為它的底層,假如我們需要實(shí)例化這個(gè)Service,可能要每次都搞清楚這個(gè)Service所有底層類的構(gòu)造函數(shù),這可能會(huì)把人逼瘋。如果利用IOC的話,你只需要配置好,然后在需要的地方引用就行了,大大增加了項(xiàng)目的可維護(hù)性且降低了開發(fā)難度。
Spring時(shí)代我們一般通過XML文件來配置Bean,后來開發(fā)人員覺得用XML文件來配置不太好,于是Sprng Boot注解配置就慢慢開始流行起來。
AOP(Aspect-Oriented Programming,面向切面編程)能夠?qū)⒛切┡c業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可擴(kuò)展性和可維護(hù)性。
Spring AOP是基于動(dòng)態(tài)代理的,如果要代理的對(duì)象實(shí)現(xiàn)了某個(gè)接口,那么Spring AOP就會(huì)使用JDK動(dòng)態(tài)代理去創(chuàng)建代理對(duì)象;而對(duì)于沒有實(shí)現(xiàn)接口的對(duì)象,就無法使用JDK動(dòng)態(tài)代理,轉(zhuǎn)而使用CGlib動(dòng)態(tài)代理生成一個(gè)被代理對(duì)象的子類來作為代理。
當(dāng)然也可以使用AspectJ,Spring AOP中已經(jīng)集成了AspectJ,AspectJ應(yīng)該算得上是Java生態(tài)系統(tǒng)中最完整的AOP框架了。使用AOP之后我們可以把一些通用功能抽象出來,在需要用到的地方直接使用即可,這樣可以大大簡(jiǎn)化代碼量。我們需要增加新功能也方便,提高了系統(tǒng)的擴(kuò)展性。日志功能、事務(wù)管理和權(quán)限管理等場(chǎng)景都用到了AOP。
Spring AOP是屬于運(yùn)行時(shí)增強(qiáng),而AspectJ是編譯時(shí)增強(qiáng)。Spring AOP基于代理(Proxying),而AspectJ基于字節(jié)碼操作(Bytecode Manipulation)。
Spring AOP已經(jīng)集成了AspectJ,AspectJ應(yīng)該算得上是Java生態(tài)系統(tǒng)中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加強(qiáng)大,但是Spring AOP相對(duì)來說更簡(jiǎn)單。
如果我們的切面比較少,那么兩者性能差異不大。但是,當(dāng)切面太多的話,最好選擇AspectJ,它比SpringAOP快很多。
大部分時(shí)候我們并沒有在系統(tǒng)中使用多線程,所以很少有人會(huì)關(guān)注這個(gè)問題。單例bean存在線程問題,主要是因?yàn)楫?dāng)多個(gè)線程操作同一個(gè)對(duì)象的時(shí)候,對(duì)這個(gè)對(duì)象的非靜態(tài)成員變量的寫操作會(huì)存在線程安全問題。
有兩種常見的解決方案:
Spring中的bean生命周期?
談到這個(gè)問題,我們不得不提提之前Model1和Model2這兩個(gè)沒有Spring MVC的時(shí)代。
**Model1時(shí)代:**很多學(xué)Java比較晚的后端程序員可能并沒有接觸過Model1模式下的JavaWeb應(yīng)用開發(fā)。在Model1模式下,整個(gè)Web應(yīng)用幾乎全部用JSP頁面組成,只用少量的JavaBean來處理數(shù)據(jù)庫連接,訪問等操作。這個(gè)模式下JSP即是控制層又是表現(xiàn)層。顯而易見,這種模式存在很多問題。比如將控制邏輯和表現(xiàn)邏輯混雜在一起,導(dǎo)致代碼重用率極低;又比如前端和后端相互依賴,難以進(jìn)行測(cè)試并且開發(fā)效率極低。
Model2時(shí)代:學(xué)過Servlet并做過相關(guān)Demo的朋友應(yīng)該了解Java Bean(Model)+JSP(View)+Servlet(Controller)這種開發(fā)模式,這就是早期的Java Web MVC開發(fā)模式。Model是系統(tǒng)中涉及的數(shù)據(jù),也就是dao和bean;View是用來展示模型中的數(shù)據(jù),只是用來展示;Controller是將用戶請(qǐng)求都發(fā)送給Servlet做處理,返回?cái)?shù)據(jù)給JSP并展示給用戶。
Model2模式下還存在很多問題,Model2的抽象和封裝程度還遠(yuǎn)遠(yuǎn)不夠,使用Model2進(jìn)行開發(fā)時(shí)不可避免地會(huì)重復(fù)造輪子,這就大大降低了程序的可維護(hù)性和可復(fù)用性。于是很多Java Web開發(fā)相關(guān)的MVC框架應(yīng)運(yùn)而生,比如Struts2,但是由于Struts2比較笨重,隨著Spring輕量級(jí)開發(fā)框架的流行,Spring生態(tài)圈出現(xiàn)了Spring MVC框架。Spring MVC是當(dāng)前最優(yōu)秀的MVC框架,相比于Struts2,Spring MVC使用更加簡(jiǎn)單和方便,開發(fā)效率更高,并且Spring MVC運(yùn)行速度更快。
MVC是一種設(shè)計(jì)模式,Spring MVC是一款很優(yōu)秀的MVC框架。Spring MVC可以幫助我們進(jìn)行更簡(jiǎn)潔的Web層的開發(fā),并且它天生與Spring框架集成。Spring MVC下我們一般把后端項(xiàng)目分為Service層(處理業(yè)務(wù))、Dao層(數(shù)據(jù)庫操作)、Entity層(實(shí)體類)、Controller層(控制層,返回?cái)?shù)據(jù)給前臺(tái)頁面)。
Spring MVC的簡(jiǎn)單原理圖如下:
流程說明:
1.客戶端(瀏覽器)發(fā)送請(qǐng)求,直接請(qǐng)求到DispatcherServlet。
2.DispatcherServlet根據(jù)請(qǐng)求信息調(diào)用HandlerMapping,解析請(qǐng)求對(duì)應(yīng)的Handler。
3.解析到對(duì)應(yīng)的Handler(也就是我們平常說的Controller控制器)。
4.HandlerAdapter會(huì)根據(jù)Handler來調(diào)用真正的處理器來處理請(qǐng)求和執(zhí)行相對(duì)應(yīng)的業(yè)務(wù)邏輯。
5.處理器處理完業(yè)務(wù)后,會(huì)返回一個(gè)ModelAndView對(duì)象,Model是返回的數(shù)據(jù)對(duì)象,View是邏輯上的View。
6.ViewResolver會(huì)根據(jù)邏輯View去查找實(shí)際的View。
7.DispatcherServlet把返回的Model傳給View(視圖渲染)。
8.把View返回給請(qǐng)求者(瀏覽器)。
##Spring框架中用到了哪些設(shè)計(jì)模式?
@Bean注解的使用示例:
@Configurationpublic class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); }}復(fù)制代碼
上面的代碼相當(dāng)于下面的XML配置:
<beans> <bean id="transferService" class="com.common.TransferServiceImpl"/></beans>復(fù)制代碼
下面這個(gè)例子是無法通過@Component注解實(shí)現(xiàn)的:
@Beanpublic OneService getService(status) { case (status) { when 1: return new serviceImpl1(); when 2: return new serviceImpl2(); when 3: return new serviceImpl3(); }}復(fù)制代碼
我們一般使用@Autowired注解去自動(dòng)裝配bean。而想要把一個(gè)類標(biāo)識(shí)為可以用@Autowired注解自動(dòng)裝配的bean,可以采用以下的注解實(shí)現(xiàn):
在TransactionDefinition接口中定義了五個(gè)表示隔離級(jí)別的常量:
**ISOLATION_DEFAULT:**使用后端數(shù)據(jù)庫默認(rèn)的隔離級(jí)別,Mysql默認(rèn)采用的REPEATABLE_READ隔離級(jí)別;Oracle默認(rèn)采用的READ_COMMITTED隔離級(jí)別。
**ISOLATION_READ_UNCOMMITTED:**最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀。
**ISOLATION_READ_COMMITTED:**允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生
**ISOLATION_REPEATABLE_READ:**對(duì)同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生。
**ISOLATION_SERIALIZABLE:**最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別。所有的事務(wù)依次逐個(gè)執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級(jí)別可以防止臟讀、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能。通常情況下也不會(huì)用到該級(jí)別。
在TransactionDefinition接口中定義了八個(gè)表示事務(wù)傳播行為的常量。
**PROPAGATION_REQUIRED:**如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。
PROPAGATION_SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
PROPAGATION_MANDATORY: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。(mandatory:強(qiáng)制性)。
PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
###其他情況:
PROPAGATION_NESTED: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;如果當(dāng)前沒有事務(wù),則該取值等價(jià)于PROPAGATION_REQUIRED。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Spring框架的小技巧內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!
網(wǎng)站名稱:Spring框架的小技巧-創(chuàng)新互聯(lián)
鏈接分享:http://aaarwkj.com/article18/dpjogp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、搜索引擎優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、服務(wù)器托管、網(wǎng)站制作、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容