1. 程式人生 > >《Java EE網際網路輕量級框架整合開發》Spring基礎筆記

《Java EE網際網路輕量級框架整合開發》Spring基礎筆記

Spring IOC容器的初始化和依賴注入

Spring IOC容器初始化有兩個步驟,先定義,然後初始化和依賴注入
Bean的定義分為3步:
1.Resource定位,這步是IOC容器根據開發者的配置,進行資源定位,定位有通過XML和註解兩種方式。
2.BeanDefinition的載入,將Resource定義到的資訊封裝到BeanDefinition中,此時並沒有建立Bean例項
3.BeanDefinition的註冊,將BeanDefinition的資訊釋出到IOC容器中,此時仍然沒有建立Bean例項
完成了Bean的定義後,Bean在IOC容器中還未初始化以及依賴注入,Spring有一個配置選項-lazy-init,用來設定Bean的初始化時間,如果為true,則會在呼叫getBean方法時進行初始化,預設為false,即初始化IOC容器後預設會初始化全部Bean。

Spring Bean的生命週期

1.Spring對bean進行例項化
2.Spring將值和bean的引用注入到bean對應的屬性中
3.如果bean實現了BeanNameAware介面,Spring和bean的ID傳遞給setBeanName()方法
4.如果bean實現了BeanFactoryAware介面,Spring將呼叫setBeanFactory()方法,將BeanFactory容器例項傳入
5.如果bean實現了ApplicationContextAware介面,Spring將呼叫setApplicationContext()方法,將bean所在的應用上下文的引用傳入進來
6.如果bean實現了BeanPostProcessor介面,Spring將呼叫它們的postProcessBeforeIntialization()方法
7.如果bean實現了InitializingBean介面,Spring將呼叫它們的afterPropertiesSet()方法
8.然後會呼叫自定義的初始化方法,如果bean使用了init-method聲明瞭初始化方法,該方法也會被呼叫
9.如果bean實現了beanPostProcessor介面,Spring將呼叫它們的PostProcessAfterInitialization()方法
10.此時bean已經準備就緒,已經被應用程式使用了,它們將一直駐留在應用上下文中,直到該應用上下文被銷燬。
11.如果bean實現了DisposableBean介面,Spring將呼叫它的destory()介面方法,同樣如果bean使用destroy-method聲明瞭銷燬方法,該方法也會被呼叫

Spring資料庫事務管理

在Spring中資料庫事務是通過PlatformTransactionManager進行管理的,Spring中支援事務的是org.springframework.transaction.support.TransactionTemplate模板,它是Spring所提供的事務管理器模板,裡面配置了事務操作的模板。
如果使用的是MyBatis框架,用的最多的事務管理器是DataSourceTransactionManager,如果使用的是Hibernate,那麼就要用到HibernateTransactionManager,配置有XML配置和Java配置兩種方式。

程式設計式事務

程式設計式事務以程式碼的方式管理事務,需要使用TransactionDefinition的預設實現類DefaultTransactionDefinition定義事務。

宣告式事務

宣告式事務是一種約定性的事務,宣告式事務使用XML或者註解@Transactional進行配置。
使用宣告式事務需要配置註解驅動,需要在Spring配置檔案中加入如下配置,transactional-manager為事務對應bean的id
<tx:annotation-driven transaction-manager=“transactionManager”/>

宣告式事務的流程

在Spring IOC容器初始化時,Spring會讀入這個註解或者XML配置的事務資訊,然後儲存到事務定義類裡面(TransactionDefinition的實現類中),當執行時會讓Spring(AOP技術)攔截註解標註的某一個方法或者類的所有方法。
具體流程為首先Spring會通過事務管理器(PlatformTransactionManager的子類)建立事務,與此同時會把事務定義中的隔離級別、超時時間等屬性根據配置內容往事務上設定。並且根據傳播行為配置採取一種特定的策略,然後會啟動開發者提供的業務程式碼,並進行後續流程。

Spring隔離級別和傳播行為

隔離級別

決定隔離級別的是效能和資料一致性。
資料庫常見隔離級別有四種:讀未提交、讀已提交、重複讀、序列化。
從讀未提交到序列化效能逐漸下降,但是資料一致性能夠得到更好的保證。序列化會嚴重壓制併發,由於等待鎖會導致大量執行緒等待,從而降低效能,所以一般在高併發場景下不選擇通過序列化保證資料一致性,大部分場景下會選擇讀已提交的方式設定事務,這樣一定程度上提高了併發,也解決了髒讀問題,資料一致性的問題可以用其他方式去解決,比如使用@Transactional方法進行配置。
對於一些併發量不大的場景可以考慮使用序列化隔離級別。

傳播行為

傳播行為是指方法之間的呼叫事務策略的問題。由於有些場景希望事務能夠全部成功或者全部失敗,也有些場景希望失敗的不影響成功的操作(比如銀行還款,失敗的操作如果影響了成功的還款操作就會出現問題),所以Spring的傳播行為就是為了解決這類問題而出現的。
在Spring中傳播行為的型別,是通過一個列舉型別定義的,共定義了7種傳播行為。