阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

在阿里P8承認Spring為面試重點後,這本筆記在程序員的手中就是“香餑餑”了

本文總體分為十個部分:

  • 第一部分:Spring整體架構介紹
  • 第二部分:容器的實現原理
  • 第三部分:默認標籤的解析
  • 第四部分:自定義標籤的解析
  • 第五部分:Bean的加載過程介紹
  • 第六部分:容器的功能擴展
  • 第七部分:AOP的介紹
  • 第八部分:整合Mybatis
  • 第九部分:Spring事務
  • 第十部分:SpringMVC介紹

筆記已經被小編整理成為PDF,有需要的朋友私信我(Spring)即可免費獲取

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

第一部分:Spring整體架構介紹

Spring框架是一個分層架構,它包含一系列的功能要素,並被分為大約20個模塊,如這些模塊被總結為以下幾部分:

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

Core Container

Core Container (核心容器)包含有Core、Beans、 Context 和Expression Language模塊。Core和Beans模塊是框架的基礎部分,提供loC (轉控制)和依賴注人特性。這裡的基礎概念是BeanFactory,它提供對Factory 模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關係和配置。

Data Access/Integration

Data Access/Integration層包含有JDBC、ORM、OXM、JMS和Transaction模塊

Web

Web_上下文模塊建立在應用程序上下文模塊之上,為基於Web的應用程序提供了上下文。所以,Spring框架支持與Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。Web層包含了Web、Web-Servlet、 Web Struts和Web-Porlet模塊。

AOP

AOP模塊提供了-一個符合AOP聯盟標準的面向切面編程的實現,它讓你可以定義例如方法攔截器和切點,從而將邏輯代碼分開,降低它們之間的耦合性。利用source-level 的元數據功能,還可以將各種行為信息合併到你的代碼中,這有點像.Net技術中的atribute概念。通過配置管理特性,Spring AOP模塊直接將面向切面的編程功能集成到了Spring框架中,所以可以很容易地使Spring框架管理的任何對象支持AOP。Spring AOP模塊為基於Spring的應用程序中的對象提供了事務管理服務。通過使用Spring AOP,不用依賴EJB組件,就可以將聲明性事務管理集成到應用程序中。

Test

Test模塊支持使用JUnit和TestNG對Spring 組件進行測試

第二部分:容器的實現原理

bean是Spring中最核心的東西,因為Spring就像是個大水桶,而bean就像是容器中的水,水桶脫離了水便也沒什麼用處了,那麼我們先看看bean的定義。

<code>public class MyTestBean {
private String testStr = "teststr";
public String getTestStr() {
return teststr;
public void setTestStr (String teststr) {
this.testStr = testStr;
很普通,bean沒有任何特別之處,的確,Spring 的目的就是讓我們的bean能成為- - 個純
粹的POJO,這也是Spring所追求的。接下來看看配置文件:



/<code>

在上面的配置中我們看到了bean 的聲明方式,儘管Spring中bean的元素定義著N種屬性來支撐我們業務的各種應用,但是我們只要聲明成這樣,基本上就已經可以滿足我們的大多數應用了。好了,你可能覺得還有什麼,但是真沒了,Spring 的示例到這裡已經結束,我們可以寫測試代碼測試了。

<code>@SuppressWarnings ("deprecation")
public class BeanFactoryTest {
@Test
public void testSimpleLoad() {
BeanFactorybf = new XmlBeanFactory (new ClassPathResource ( "beanFactoryTest . xm1"));
MyTestBean bean= (NyTestBean) bf . getBean ("myTestBean");
assertEquals ("teststr" , bean. getTestStr());
}/<code>

相信聰明的讀者會很快看到我們期望的結果:在Eclipse中顯示了Green Baro直接使用BeanFactory

作為容器對於Spring 的使用來說並不多見,甚至是甚少使用,因為在企業級的應用中大多數都會使用的是ApplicationContext(後續文章我們會介紹它們之間的區別),這裡只是用於測試,讓朋友們更快更好地分析Spring的內部原理

第三部分:默認標籤的解析

在4種標籤的解析中,對bean標籤的解析最為複雜也最為重要,所以我們從此標籤開始深入分析,如果能理解此標籤的解析過程,其他標籤的解析自然會迎刃而解。

首先我們進入函數processBeanDefinition(ele, delegate)。

<code>protected void processBeanDefinition (Element ele, BeanDefinitionParserDelegate delegate) {
BeanDefinitionlolder bdHolder - delegate .parseBeanDefinitionElement (ele) ;
if (bdHolder != null) {
bdHolder = de legate . decora teBeanDefini tionIfRequired (ele, bdHolder) ;
try {
BeanDefinitionReaderUtils .registerBeanDefinition (bdHolder, getReaderContext () .
getRegistry()) ;
catch
(BeanDefinitionStoreException ex) {
getReaderContext () .error ("Failed to register bean definition with name '" +
bdHolder . getBeanName() +"'", ele, ex);
                  }
getReaderContext () .fireComponentRegistered (new BeanCorponentDefinition (bdHolder));
         }
}/<code>

乍一看,似乎一頭霧水,沒有以前的函數那樣清晰的邏輯。大致的邏輯總結如下:

(1)首先委託BeanDefinitionDelegate類的parseBeanDefinitionElement方法進行元素解析,返回BeanDefinitionHolder 類型的實例bdHolder,經過這個方法後,bdHolder 實例已經包含我們配置文件中配置的各種屬性了,例如class、name、id、alias 之類的屬性。

(2)當返回的bdHolder不為空的情況下若存在默認標籤的子節點下再有自定義屬性,還需要再次對自定義標籤進行解析。

(3)解析完成後,需要對解析後的bdHolder 進行註冊,同樣,註冊操作委託給了BeanDefinitionReaderUtils的registerBeanDefinition 方法。

(4)最後發出響應事件,通知相關的監聽器,這個bean已經加載完成了。

第四部分:自定義標籤的解析

在很多情況下,我們需要為系統提供可配置化支持,簡單的做法可以直接基於Spring的標準bean來配置,當配置較為複雜或者需要更多豐富控制的時候,會顯得非常笨拙。一般的做法會用原生態的方式去解析定義好的XML文件,然後轉化為配置對象。這種方式當然可以解決所有問題,但實現起來比較繁瑣,特別是在配置非常複雜的時候,解析工作是一一個不得不考慮的負擔。

Spring 提供了可擴展Schema的支持,這是-一個不錯的折中方案,擴展Spring自定義標籤配置大致需要以下幾個步驟:(前提是要把Spring的Core包加入項目中)

  1. 創建- -個需要擴展的組件
  2. 定義一個XSD文件描述組件內容
  3. 創建一個文件, 實現BeanDefinitionParser 接口,用來解析XSD文件中的定義和組件定義
  4. 創建- 一個Handler文件,擴展自NamespaceHandlerSupport,目 的是將組件註冊到Spring容器
  5. 編寫 Spring.handlers和Spring.schemas文件
阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

第五部分:Bean的加載過程介紹

Bean加載過程中的步驟分為以下9步:

(1 )轉換對應beanName

或許很多人不理解轉換對應beanName是什麼意思,傳人的參數name不就是beanName嗎?其實不是,這裡傳人的參數可能是別名,也可能是FactoryBean,所以需要進行一系列的解析,這些解析內容包括如下內容。去除 FactoryBean的修飾符,也就是如果name ="&aa", 那麼會首先去除&而使name= "a".取指定 alias所表示的最終beanName,例如別名A指向名稱為B的bean則返回B;若別名A指向別名B,別名B又指向名稱為C的bean則返回C。

(2)嘗試從緩存中加載單例

單例在Spring的同一個容器內只會被創建-一次,後續再獲取bean,就直接從單例緩存中獲取了。當然這裡也只是嘗試加載,首先嚐試從緩存中加載,如果加載不成功則再次嘗試從singletonFactories中加載。因為在創建單例bean的時候會存在依賴注入的情況,而在創建依賴的時候為了避免循環依賴,在Spring中創建bean的原則是不等bean創建完成就會將創建bean的ObjectFactory提早曝光加入到緩存中,一旦下一個bean創建時候需要依賴上一個bean則直接使用ObjectFactory 。

(3) bean的實例化

如果從緩存中得到了bean的原始狀態,則需要對bean進行實例化。這裡有必要強調-下,緩存中記錄的只是最原始的bean狀態,並不- - 定是我們最終想要的bean。舉個例子,假如我們需要對工廠bean 進行處理,那麼這裡得到的其實是工廠bean 的初始狀態,但是我們真正需要的是廠bean 中定義的factory-method方法中返回的bean,而getObjectForBeanInstance就是完成這個工作的。

內容過多,後面幾個小節點,小編我用圖片代替:

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

第六部分:容器的功能擴展

設置了路徑之後,便可以根據路徑做配置文件的解析以及各種功能的實現了。可以說.refresh函數中包含了幾乎ApplicationContext 中提供的全部功能,而且此函數中邏輯非常清晰明瞭,使我們很容易分析對應的層次及邏輯。內容過多,小編圖片展示。

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

第七部分:AOP的功能介紹

(1)創建用於攔截的bean

在實際工作中,此bean可能是滿足業務需要的核心邏輯,例如test方法中可能會封裝著某個核心業務,但是,如果我們想在test前後加入日誌來跟蹤調試,如果直接修改源碼並不符合面向對象的設計方法,而且隨意改動原有代碼也會造成一定的風險,還好接下來的Spring 幫我們做到了這一點。

(2)創建Advisor

Spring中摒棄了最原始的繁雜配置方式而採用@AspectJ 註解對POJO進行標註,使AOP的工作大大簡化,例如,在AspectTest類中,我們要做的就是在所有類的test 方法執行前在控制檯中打印beforeTest,而在所有類的test方法執行後打印afterTest,同時又使用環繞的方式在所有類的方法執行前後再次分別打印beforel和after1。

(3)創建配置文件

XML是Spring的基礎。儘管Spring 一再簡化配置,並且大有使用註解取代XML配置之勢,但是無論如何,至少現在XML還是Spring 的基礎。要在Spring 中開啟AOP功能,還需要在配置文件中作聲明

(4)測試

經過以上步驟後,便可以驗證Spring的AOP為我們提供的神奇效果了

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

第八部分:整合Mybatis

儘管我們接觸更多的是MyBatis與Spring的整合使用,但是MyBatis有它自己的獨立使用方法,瞭解其獨立使用的方法套路對分析Spring整合MyBatis非常有幫助,因為Spring無非就是將這些功能進行封裝以簡化我們的開發流程。

MyBatis 獨立使用包括以下幾步:

(1)建立PO

用於對數據庫中數據的映射,使程序員更關注於對Java類的使用而不是數據庫的操作

(2)建立Mapper

數據庫操作的映射文件,也就是我們常常說的DAO,用於映射數據庫的操作,可以通過配置文件指定方法對應的SQL語句或者直接使用Java提供的註解方式進行SQL指定。

(3)建立配置文件

配置文件主要用於配置程序中可變性高的設置,一個偏大的程序一定會存在一 些經常 會變化的變量,如果每次變化都需要改變源碼那會是非常糟糕的設計,所以,我們看到各種各樣的框架或者應用的時候都免不了要配置配置文件,MyBatis 中的配置文件主要封裝在configuration中,配置文件的基本結構如圖所示。

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

(4)建立映射文件

對應於MyBaits 全局配置中的mappers 配置屬性,主要用於建立對應數據庫操作接口的SQL映射。MyBatis會將這裡設定的SQL與對應的Java接口相關聯,以保證在MyBatis中調用接口的時候會到數據庫中執行相應的SQL來簡化開發。

第九部分:Spring事務

Spring事務使用分為以下7步:

(1)創建數據表結構

(2)創建對應數據表的PO

(3)創建表與實體間的映射

(4)創建數據操作接口

(5)創建數據操作接口實現類

(6)創建Spring配置文件

(7)測試

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

第十部分:SpringMVC介紹

Spring的快速體驗有以下6步:

(1)配置web.xml

(2)創建Spring配置文件applicationContext.xml。

(3)創建model

(4)創建cololer

(5)創建視圖文件usreistispo

(6)創建Servlet配置文件Spring- servlet.xml

阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記

最後

需要完整版筆記PDF的朋友記得轉發,再私信小編(Spring)即可免費獲得,也希望轉發點贊朋友看完資料能破百度、戰阿里、拼騰訊,拿到屬於自己心中想要的offer

重要的點再說一句,一定要轉發因為這樣可以幫助到更多需要或者想要資料的朋友),在私信小編(Spring)即可


阿里P8親口承認:Spring為面試重點,90%的程序員都想要這本筆記


分享到:


相關文章: