欄目為大家介紹Spring必須掌握的內容。
大家好!我是熱心的朝陽群眾。
Spring框架在面試中是一個必問點,裡面究竟有哪些內容呢?讓我們一起來看看。這也是我在面試中經常會問到的問題,也是體現一個程式設計師對框架理解的能力。
Spring是一種輕量級框架,旨在提高開發人員的開發效率以及系統的可維護性。
我們一般說的Spring框架就是Spring Framework,它是很多模組的集合,使用這些模組可以很方便地協助我們進行開發。這些模組是核心容器、資料存取/整合、Web、AOP(面向切面程式設計)、工具、訊息和測試模組。比如Core Container中的Core元件是Spring所有元件的核心,Beans元件和Context元件是實現IOC和DI的基礎,AOP元件用來實現面向切面程式設計。
Spring的6個特徵:
下圖對應的是Spring 4.x的版本,目前最新的5.x版本中Web模組的Portlet元件已經被廢棄掉,同時增加了用於非同步響應式處理的WebFlux元件。
IOC(Inversion Of Controll,控制反轉)是一種設計思想,就是將原本在程式中手動建立物件的控制權,交由給Spring框架來管理。IOC在其他語言中也有應用,並非Spring特有。IOC容器是Spring用來實現IOC的載體,IOC容器實際上就是一個Map(key, value),Map中存放的是各種物件。
將物件之間的相互依賴關係交給IOC容器來管理,並由IOC容器完成物件的注入。這樣可以很大程度上簡化應用的開發,把應用從複雜的依賴關係中解放出來。IOC容器就像是一個工廠一樣,當我們需要建立一個物件的時候,只需要設定好組態檔/註解即可,完全不用考慮物件是如何被建立出來的。在實際專案中一個Service類可能由幾百甚至上千個類作為它的底層,假如我們需要範例化這個Service,可能要每次都搞清楚這個Service所有底層類別建構函式,這可能會把人逼瘋。如果利用IOC的話,你只需要設定好,然後在需要的地方參照就行了,大大增加了專案的可維護性且降低了開發難度。
Spring時代我們一般通過XML檔案來設定Bean,後來開發人員覺得用XML檔案來設定不太好,於是Sprng Boot註解設定就慢慢開始流行起來。
AOP(Aspect-Oriented Programming,面向切面程式設計)能夠將那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任(例如事務處理、紀錄檔管理、許可權控制等)封裝起來,便於減少系統的重複程式碼,降低模組間的耦合度,並有利於未來的可延伸性和可維護性。
Spring AOP是基於動態代理的,如果要代理的物件實現了某個介面,那麼Spring AOP就會使用JDK動態代理去建立代理物件;而對於沒有實現介面的物件,就無法使用JDK動態代理,轉而使用CGlib動態代理生成一個被代理物件的子類來作為代理。
當然也可以使用AspectJ,Spring AOP中已經整合了AspectJ,AspectJ應該算得上是Java生態系統中最完整的AOP框架了。使用AOP之後我們可以把一些通用功能抽象出來,在需要用到的地方直接使用即可,這樣可以大大簡化程式碼量。我們需要增加新功能也方便,提高了系統的擴充套件性。紀錄檔功能、事務管理和許可權管理等場景都用到了AOP。
Spring AOP是屬於執行時增強,而AspectJ是編譯時增強。Spring AOP基於代理(Proxying),而AspectJ基於位元組碼操作(Bytecode Manipulation)。
Spring AOP已經整合了AspectJ,AspectJ應該算得上是Java生態系統中最完整的AOP框架了。AspectJ相比於Spring AOP功能更加強大,但是Spring AOP相對來說更簡單。
如果我們的切面比較少,那麼兩者效能差異不大。但是,當切面太多的話,最好選擇AspectJ,它比SpringAOP快很多。
大部分時候我們並沒有在系統中使用多執行緒,所以很少有人會關注這個問題。單例bean存線上程問題,主要是因為當多個執行緒操作同一個物件的時候,對這個物件的非靜態成員變數的寫操作會存線上程安全問題。
有兩種常見的解決方案:
Spring中的bean生命週期?
談到這個問題,我們不得不提提之前Model1和Model2這兩個沒有Spring MVC的時代。
**Model1時代:**很多學Java比較晚的後端程式設計師可能並沒有接觸過Model1模式下的JavaWeb應用開發。在Model1模式下,整個Web應用幾乎全部用JSP頁面組成,只用少量的JavaBean來處理資料庫連線,存取等操作。這個模式下JSP即是控制層又是表現層。顯而易見,這種模式存在很多問題。比如將控制邏輯和表現邏輯混雜在一起,導致程式碼重用率極低;又比如前端和後端相互依賴,難以進行測試並且開發效率極低。
Model2時代:學過Servlet並做過相關Demo的朋友應該瞭解Java Bean(Model)+JSP(View)+Servlet(Controller)這種開發模式,這就是早期的Java Web MVC開發模式。Model是系統中涉及的資料,也就是dao和bean;View是用來展示模型中的資料,只是用來展示;Controller是將使用者請求都傳送給Servlet做處理,返回資料給JSP並展示給使用者。
Model2模式下還存在很多問題,Model2的抽象和封裝程度還遠遠不夠,使用Model2進行開發時不可避免地會重複造輪子,這就大大降低了程式的可維護性和可複用性。於是很多Java Web開發相關的MVC框架應運而生,比如Struts2,但是由於Struts2比較笨重,隨著Spring輕量級開發框架的流行,Spring生態圈出現了Spring MVC框架。Spring MVC是當前最優秀的MVC框架,相比於Struts2,Spring MVC使用更加簡單和方便,開發效率更高,並且Spring MVC執行速度更快。
MVC是一種設計模式,Spring MVC是一款很優秀的MVC框架。Spring MVC可以幫助我們進行更簡潔的Web層的開發,並且它天生與Spring框架整合。Spring MVC下我們一般把後端專案分為Service層(處理業務)、Dao層(資料庫操作)、Entity層(實體類)、Controller層(控制層,返回資料給前臺頁面)。
Spring MVC的簡單原理圖如下:
流程說明:
1.使用者端(瀏覽器)傳送請求,直接請求到DispatcherServlet。
2.DispatcherServlet根據請求資訊呼叫HandlerMapping,解析請求對應的Handler。
3.解析到對應的Handler(也就是我們平常說的Controller控制器)。
4.HandlerAdapter會根據Handler來呼叫真正的處理器來處理請求和執行相對應的業務邏輯。
5.處理器處理完業務後,會返回一個ModelAndView物件,Model是返回的資料物件,View是邏輯上的View。
6.ViewResolver會根據邏輯View去查詢實際的View。
7.DispatcherServlet把返回的Model傳給View(檢視渲染)。
8.把View返回給請求者(瀏覽器)。
##Spring框架中用到了哪些設計模式?
@Bean註解的使用範例:
@Configurationpublic class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); }}複製程式碼
上面的程式碼相當於下面的XML設定:
<beans> <bean id="transferService" class="com.common.TransferServiceImpl"/></beans>複製程式碼
下面這個例子是無法通過@Component註解實現的:
@Beanpublic OneService getService(status) { case (status) { when 1: return new serviceImpl1(); when 2: return new serviceImpl2(); when 3: return new serviceImpl3(); }}複製程式碼
我們一般使用@Autowired註解去自動裝配bean。而想要把一個類標識為可以用@Autowired註解自動裝配的bean,可以採用以下的註解實現:
在TransactionDefinition介面中定義了五個表示隔離級別的常數:
**ISOLATION_DEFAULT:**使用後端資料庫預設的隔離級別,Mysql預設採用的REPEATABLE_READ隔離級別;Oracle預設採用的READ_COMMITTED隔離級別。
**ISOLATION_READ_UNCOMMITTED:**最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀。
**ISOLATION_READ_COMMITTED:**允許讀取並行事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生
**ISOLATION_REPEATABLE_READ:**對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。
**ISOLATION_SERIALIZABLE:**最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。
在TransactionDefinition介面中定義了八個表示事務傳播行為的常數。
**PROPAGATION_REQUIRED:**如果當前存在事務,則加入該事務;如果當前沒有事務,則建立一個新的事務。
PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。(mandatory:強制性)。
PROPAGATION_REQUIRES_NEW: 建立一個新的事務,如果當前存在事務,則把當前事務掛起。
PROPAGATION_NOT_SUPPORTED: 以非事務方式執行,如果當前存在事務,則把當前事務掛起。
PROPAGATION_NEVER: 以非事務方式執行,如果當前存在事務,則丟擲異常。
###其他情況:
PROPAGATION_NESTED: 如果當前存在事務,則建立一個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於PROPAGATION_REQUIRED。
希望大家能掌握這些內容,也能夠繼續支援我,感謝。
更多相關免費學習推薦:(視訊)
以上就是收藏!Spring必須掌握的內容的詳細內容,更多請關注TW511.COM其它相關文章!