網際網路輕量級框架SSM-查缺補漏第九天
簡言:
第九章 Spring Ioc的概念
IoC(Inversion of Control)控制反轉:比如想喝橙汁,在沒有飲品店的日子,最直觀的做法是買果汁機、橙汁。這是你自己“主動”創造的過程,也就是一杯橙汁需要主動創造。然而到了今時今日,由於飲品店的盛行,已經沒必要自己去榨橙汁了。飲品店提供給你橙汁,這一過程你沒有去“主動”創造,但是也完全達到了你的要求。這就是 控制反轉 。
在Spring中,它會認為一切Java類都是資源,而資源都是Bean,容納這些Bean的是Spring所提供的IoC容器,所以Spring是一種基於Bean的程式設計。
Spring ioc 容器
在Spring中實現控制反轉的是IoC容器,其實現方式是依賴注入(Dependency Injection,DI),簡單的說,Ioc容器是用來存放一些例項的,通過依賴注入,將例項注入Ioc容器,此時你不需要去主動建立例項,只需要從Ioc容器中取就好了。
Spring IoC容器的設計主要基於 BeanFactory 和 ApplicationContext 兩個介面。ApplicationContext是BeanFactory的子介面之一,換句話說BeanFactory是Spring IoC容器說定義的最底層介面,而ApplicationContext是其高階介面之一。
Spring IoC容器的初始化和依賴注入
過程:先定義Bean,然後初始化Bean,然後依賴注入Spring IoC容器。
Bean的定義:
- Resource定位 ,這步是Spring Ioc根據開發者的配置,進行資源定位。在Spring的開發過程中,開發者通過XML或註解進行配置。
- BeanDefinition的載入 ,這個時候只是將Resource定位到的資訊,儲存到Bean定義(BeanDefinition)中,此時部位建立Bean的例項。
- BeanDefinition的註冊 ,這個過程就是將BeanDefinition的資訊釋出到Spring Ioc 容器中。 注意,此時仍舊沒有對應的Bean的例項建立 。
Bean的初始化:
Spring Bean還有一個配置選項——lazy-init,其含義及時是否初始化Spring Bean(意思是時候採用懶漢模式)。預設值為false,預設會自動初始化Bean。如果將其設定為true,那麼只有當我們使用Spring IoC容器的getBean方法獲取它時,它才會進行Bean的初始化,完成依賴注入。
Spring Bean的生命週期
一下是Spring Bean的生命週期過程:
第十一章 面向切面程式設計(AOP)
如果說IoC是Spring的核心,那麼面向切面程式設計就是Spring最為重要的功能之一了,在資料庫事務中,切面程式設計被廣泛使用。
AOP:通過動態代理模式,帶來管控各個物件操作的切面環境,管理包括日誌、資料庫事務等操作,讓我們擁有可以在反射原有物件方法之前正常返回、異常返回時候插入自己的路基程式碼的能力,有時候甚至取代原有方法。
相關概念:
1.切面(Aspect)
切面就是在一個怎麼楊的環境中工作。在動態代理中可以把它理解成一個攔截器。
2.通知(Advice)
通知是切面開啟後,切面的方法,它根據在代理物件真實方法呼叫前、後的順序和邏輯區分。
- 前置通知(Before):在動態代理反射原有物件或者執行環繞通知前執行的通知功能。
- 後置通知(After):在動態代理反射原有物件方法或者執行環繞通知後執行的通知功能。 無論是否丟擲一行,它都會被執行
- 返回通知(AfterReturning):在動態代理物件反射原有物件方法或者執行環繞通知後,正常返回(無異常)執行的通知功能。
- 異常通知(AfterThrowing):在動態代理物件反射原有物件方法或者執行環繞通知後,產生異常執行的通知功能。
- 環繞通知(Around):在動態代理中,它可以取代當前被攔截物件的方法,提供回撥原有被攔截物件的方法。
3.引入(Introduction)
允許我們在現有的類裡新增自定義的類和方法。
4.切點(Pointcut)
告訴SpringAOP在什麼時候啟動攔截並 織入 對應的流程中,因為並不是所有的開發都需要啟動AOP的,它往往通過正則表示式進行限定。
5.連線點(join point)
連線點對應的是具體需要攔截的東西,比如通過切點的正則表示式去判斷哪些方法是連線點,從而織入對應的通知。
6.織入(Weaving)
織入是一個生成代理物件並將切面內容放入到流程中的流程。