spring一些知識要點總結

Spring

 

優點:

  • 輕量:Spring 是輕量的,基本的版本大約2MB。
  • 控制反轉:Spring通過控制反轉實現了鬆散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
  • 面向切面的編程(AOP):Spring支持面向切面的編程,並且把應用業務邏輯和系統服務分開。
  • 容器:Spring 包含並管理應用中對象的生命週期和配置。
  • MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
  • 事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
  • 異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO拋出的)轉化爲一致的unchecked 異常。

 

Bean的生命週期

  • Spring容器 從XML 文件中讀取bean的定義,並實例化bean。
  • Spring根據bean的定義填充所有的屬性。
  • 如果bean實現了BeanNameAware 接口,Spring 傳遞bean 的ID 到 setBeanName方法。
  • 如果Bean 實現了 BeanFactoryAware 接口, Spring傳遞beanfactory 給setBeanFactory 方法。
  • 如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內調用它們。
  • 如果bean實現IntializingBean了,調用它的afterPropertySet方法,如果bean聲明瞭初始化方法,調用此初始化方法。
  • 如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被調用。
  • 如果bean實現了 DisposableBean,它將調用destroy()方法。

 

IOC

什麼是IOC

Spring的核心思想之一:Inversion of Control , 控制反轉 IOC

那麼控制反轉是什麼意思呢?對象的創建交給外部容器完成,這個就做控制反轉。

Spring使用控制反轉來實現對象不用在程序中寫死

控制反轉解決對象處理問題【把對象交給別人創建】

那麼對象的對象之間的依賴關係Spring是怎麼做的呢??依賴注入,dependency injection.

Spring使用依賴注入來實現對象之間的依賴關係

在創建完對象之後,對象的關係處理就是依賴注入

上面已經說了,控制反轉是通過外部容器完成的,而Spring又爲我們提供了這麼一個容器,我們一般將這個容器叫做:IOC容器.

無論是創建對象、處理對象之間的依賴關係、對象創建的時間還是對象的數量,我們都是在Spring爲我們提供的IOC容器上配置對象的信息就好了。

 

也就是說,甲方要達成某種目的不需要直接依賴乙方,它只需要達到的目的告訴第三方機構就可以了,比如甲方需要一雙襪子,而乙方它賣一雙襪子,它要把襪子賣出去,並不需要自己去直接找到一個賣家來完成襪子的賣出。它也只需要找第三方,告訴別人我要賣一雙襪子。這下好了,甲乙雙方進行交易活動,都不需要自己直接去找賣家,相當於程序內部開放接口,賣家由第三方作爲參數傳入。甲乙互相不依賴,而且只有在進行交易活動的時候,甲才和乙產生聯繫。反之亦然。這樣做什麼好處麼呢,甲乙可以在對方不真實存在的情況下獨立存在,而且保證不交易時候無聯繫,想交易的時候可以很容易的產生聯繫。甲乙交易活動不需要雙方見面,避免了雙方的互不信任造成交易失敗的問題。因爲交易由第三方來負責聯繫,而且甲乙都認爲第三方可靠。那麼交易就能很可靠很靈活的產生和進行了

優點:第一,資源集中管理,實現資源的可配置和易管理第二,降低了使用資源雙方的依賴程度,也就是我們說的耦合度。

 

IOC注入方式

  • 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。
  • Setter方法注入:Setter方法注入是容器通過調用無參構造器或無參static工廠 方法實例化bean之後,調用該bean的setter方法,即實現了基於setter的依賴注入。
  • 工廠注入:這個是遺留下來的,很少用的了!

AOP

將相同邏輯的重複代碼橫向抽取出來,使用動態代理技術將這些重複代碼織入到目標對象方法中,實現和原來一樣的功能。

考慮一種情況,如果我們需要在所有方法執行前打印一句日誌,按照OOP的處理思想,我們需要在每個業務方法開始時加入一些語句,但是我們辛辛苦苦加完之後,如果又要求在這句日誌打印後再打印一句,那是不是又要加一遍?這時候你一定會想到,在某個類中編寫一個日誌打印方法,該方法執行這些日誌打印操作,然後在每個業務方法之前加入這句方法調用,這就是面向對象編程思想。但是如果要求我們在業務方法結束時再打印一些日誌呢,是不是還要去每個業務方法結束時加一遍?這樣始終不是辦法,而且我們總是在改業務方法,在業務方法裏面摻雜了太多的其他操作,侵入性太高。 這時候AOP就起到作用了,我們可以編寫一個切面類(Aspect),在其中的方法中來編寫橫切邏輯(如打印日誌),然後通過配置或者註解的方式來聲明該橫切邏輯起作用的位置。

連接點(Join point):

  • 能夠被攔截的地方:Spring AOP是基於動態代理的,所以是方法攔截的。每個成員方法都可以稱之爲連接點~

切點(Poincut):

  • 具體定位的連接點:上面也說了,每個方法都可以稱之爲連接點,我們具體定位到某一個方法就成爲切點。

增強/通知(Advice):

  • 表示添加到切點的一段邏輯代碼,並定位連接點的方位信息。
    • 簡單來說就定義了是幹什麼的,具體是在哪幹
    • Spring AOP提供了5種Advice類型給我們:前置、後置、返回、異常、環繞給我們使用!

織入(Weaving):

  • 將增強/通知添加到目標類的具體連接點上的過程。

引入/引介(Introduction):

  • 引入/引介允許我們向現有的類添加新方法或屬性。是一種特殊的增強!

切面(Aspect):

  • 切面由切點和增強/通知組成,它既包括了橫切邏輯的定義、也包括了連接點的定義。

springMVC 

工作流程

 

  • 用戶發送請求
  • 請求交由核心控制器處理
  • 核心控制器找到映射器,映射器看看請求路徑是什麼
  • 核心控制器再找到適配器,看看有哪些類實現了Controller接口或者對應的bean對象
  • 將帶過來的數據進行轉換,格式化等等操作
  • 找到我們的控制器Action,處理完業務之後返回一個ModelAndView對象
  • 最後通過視圖解析器來對ModelAndView進行解析
  • 跳轉到對應的JSP/html頁面

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章