spring學習記錄_spring的 ioc核心容器
阿新 • • 發佈:2020-08-08
主要模組
- Spring Core:核心類庫,提供IOC服務。
- Spring Context:提供框架式的Bean訪問方式。
- Spring AOP:AOP服務。
- Spring DAO:對JDBC的抽象。
- Spring ORM:對現有的ORM框架的支援。
- Spring Web:提供了面向Web的綜合特性。
- Spring MVC:提供了向Web應用的MVC實現。
IOC
-
優點:控制反轉,物件的建立交給Spring配置。
-
步驟:建立配置檔案,配置要建立的物件類;建立工廠類,解析配置檔案+反射。
AOP
-
優點:面向切面程式設計,擴充套件功能不通過修改原始碼實現。
-
靜態AOP:編譯期,切面以位元組碼的形式直接編譯到目標位元組碼中。
-
動態AOP:執行期,類載入後,為介面實現動態代理類,將切面植入到動態代理類中。
設計模式
- 單例:一個Spring Bean容器(SpringContext)中僅有一個例項。
- 工廠:IOC,封裝了建立Bean的過程,不通過new而是通過工廠來獲取物件。
- 代理:AOP,代理類中持有一個被代理的例項,通過代理類呼叫被代理物件的方法,在方法前後加入其他方法處理邏輯。
- 介面卡:SpringMVC中的HandleAdapter。轉換類的介面。場景:第三方登入自由適配。
- 責任鏈:SpringMVC中的DispatchServlet。Handler定義處理請求的介面;ConcreteHandler
Bean生命週期
-
建立
-
例項化Bean。
-
注入Bean ID,Bean Factory或者ApplicationContext。
-
呼叫前置初始化方法postProcessBeforeInitialization。
-
呼叫afterPropertiesSet方法。
-
呼叫Bean自身的初始化方法。
-
呼叫Bean的後置初始化方法postProceeAfterInitialization。
-
-
銷燬
- 呼叫DisposableBean的destroy方法。
- 呼叫自身定製的destroy方法。
Bean作用域
類別 | 說明 |
---|---|
singleton | 每個IOC容器中僅存在一個Bean例項 |
prototype | 每次從容器中呼叫Bean時,會返回新的例項 |
request | 每次Http請求會建立一個新的Bean,作用域僅適用於WebApplicationContext |
session | 同一個session共享一個Bean,作用域僅適用於WebApplicationContext |
配置Bean的方法
-
基於xml的配置方式
-
基於註解的配置方式
- 定義註解:@Component,@Controller,@Repository,@Service
- 生命週期註解:@PostConstruct,@PreDestroy
- 依賴檢查註解
- 自動裝配註解:@Autowired
-
基於Java類的配置:@Configuration,@Bean
注入屬性的方法
- Setter注入,構造器注入,註解注入,介面注入。
迴圈依賴
-
兩個以上的Bean互相持有對方:構造器的迴圈依賴;屬性的迴圈依賴。
-
解決方法:先從一級快取singletonObjects獲取物件(例項化完成的Bean),若獲取不到且物件正在建立中,則從二級快取earlySingletonObjects中獲取物件,若獲取不到物件(未裝配屬性的Bean),則從三級快取singletonFactory.getObjects()獲取(例項化的BeanFactory)。
-
關鍵:呼叫構造器,根據物件引用定位到堆中的物件,提前曝光物件。
父子容器
- Spring父容器(包含mapper,service,dao等),SpringMVC子容器(包含controller等)。
- 子容器可以訪問父容器中的物件,父容器不能訪問子容器中的物件。
事務實現原理
- 劃分處理單元IOC:用Spring中的IOC劃分事務處理單元,將對事務的各種配置放到了IOC容器中。
- AOP攔截需要進行事務處理的類:生成代理物件,通過TransactionIntercepter完成對代理方法的攔截,將事務處理的功能編織到攔截的方法中。讀取IOC事務配置屬性,轉化為事務處理所需要的內部資料結構。
- 事務的處理實現:委託給具體的事務處理器(TransactionManager)實現。
類載入機制
- 過程:1、載入:生成class物件;2、驗證;3、準備:static變數分配記憶體和初始值;4、解析:符號引用替換為直接引用;5、初始化:父類沒初始化需先初始化。(
家宴準解出
) - 雙親委派機制:避免重複載入,安全。
Spring事務傳播機制
- 控制當前事務如何被傳播到呼叫的介面方法中
事務傳播行為型別 | 沒有當前事務 | 存在事務 |
---|---|---|
required | 新建 | 加入 |
supports | 非事務 | 支援 |
mandatory | 異常 | 使用 |
requires_new | 新建 | 掛起 |
not_supported | 非事務 | 掛起 |
never | 非事務 | 異常 |
nested | 新建 | 巢狀 |
BeanFactory和ApplicationContext的區別
- BeanFactory:控制Bean的生命週期,維護Bean的依賴關係;延遲載入。
- ApplicationContext: BeanFactory的子介面,提供更加完整的框架功能。容器啟動時,一次性建立所有的Bean。
Spring Boot的啟動流程
- 建立SpringApplicationRunListener
- 通知Starting
- 配置Environment
- 通知environmentPrepared
- 建立ApplicationContext
- 初始化ApplicationContext,設定Environment載入相關配置
- 通知contextPrepard,contextLoaded
- Refresh ApplicationContext
- 通知Started
- 完成啟動
- 通知running
- OVER
Spring框架中的事件
- Spring事件由ApplicationContext釋出。
- ContextStartedEvent事件:ApplicationContext啟動後觸發。
- ContextStopedEvent事件:ApplicationContext停止後觸發。
- ContextRefreshedEvent事件:ApplicationContext重新整理後觸發。
- ContextClosedEvent事件:ApplicationContext關閉後觸發。
- Bean實現了ApplicationListener介面,當一個ApplicationEvent被髮布後,bean會自動被通知。