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頁面