1. 程式人生 > >撩課-Java每天5道面試題第21天

撩課-Java每天5道面試題第21天

136.請解釋Spring Bean的生命週期?

首先說一下Servlet的生命週期:
例項化,
初始init,
接收請求service,
銷燬destroy;

 Spring上下文中的Bean生命週期也類似,
如下:
1.例項化一個Bean
也就是我們常說的new;

2.按照Spring上下文
對例項化的Bean進行配置
也就是IOC注入;

3.如果這個Bean已經實現了BeanNameAware介面,
會呼叫它實現的
setBeanName(String)方法,
此處傳遞的就是Spring配置檔案中Bean的id值;

4.如果這個Bean已經實現了BeanFactoryAware介面,
會呼叫它實現的
setBeanFactory(setBeanFactory(BeanFactory)
傳遞的是Spring工廠自身
可以用這個方式來獲取其它Bean,
只需在Spring配置檔案中
配置一個普通的Bean就可以;

5.如果這個Bean已經實現了 ApplicationContextAware介面, 會呼叫setApplicationContext(ApplicationContext)方法, 傳入Spring上下文 同樣這個方式也可以實現步驟4的內容, 但比4更好, 因為ApplicationContext是BeanFactory的子介面, 有更多的實現方法 6.如果這個Bean關聯了 BeanPostProcessor介面, 將會呼叫 postProcessBeforeInitialization(Object obj, String s)方法, BeanPostProcessor 經常被用作是Bean內容的更改, 並且由於這個是在Bean初始化結束時 呼叫那個的方法, 也可以被應用於記憶體或快取技術;
7.如果Bean在Spring配置檔案中 配置了init-method屬性 會自動呼叫其配置的初始化方法。 8.如果這個Bean關聯了BeanPostProcessor介面, 將會呼叫 postProcessAfterInitialization(Object obj, String s)方法、; 注:以上工作完成以後就可以應用這個Bean了, 那這個Bean是一個Singleton的, 所以一般情況下 們呼叫同一個id的Bean會是 在內容地址相同的例項, 當然在Spring配置檔案中 也可以配置非Singleton。 9.當Bean不再需要時, 會經過清理階段, 如果Bean實現了DisposableBean這個介面, 會呼叫那個其實現的destroy()方法;
10.最後, 如果這個Bean的Spring配置中 配置了destroy-method屬性, 會自動呼叫其配置的銷燬方法。 另外我們這裡描述的是應用Spring 上下文Bean的生命週期, 如果應用Spring的工廠 也就是BeanFactory的話去掉第5步就Ok了。

 

137.介紹下Spring的主要模組?

Spring AOP:
Spring的關鍵元件之一是AOP框架。
AOP在Spring中使用:
提供宣告性的企業服務,
特別是作為EJB宣告式服務的替代品。
最重要的服務是宣告式事務管理,
它建立在Spring的事務抽象之上。
允許使用者實現自定義的切面,
補充他們使用AOP的OOP的使用。

Spring ORM:
ORM包與資料庫訪問有關。
它為流行的物件關係對映api提供整合層,
包括JDO、Hibernate和iBatis。

Spring Web:
web應用程式開發堆疊,
其中包括Spring MVC。

Spring DAO:
Spring的DAO(Data Access Object)
支援主要用於使用JDBC、
Hibernate或JDO等
技術標準化資料訪問工作。

Spring Context:
此包構建在bean包之上,
以增加對訊息源的支援和觀察者的設計模式支援,
以及應用程式物件使用一致的
API獲得資源的能力。

Spring Web MVC:
這是為web應用程式
提供MVC實現的模組。

Spring Core:
核心包是Spring框架中最重要的元件。

該元件提供依賴性注入特性。
BeanFactory提供了一種工廠模式,
它將諸如初始化、
創造和訪問物件
與實際程式邏輯的訪問分離開來。

 

138.Spring事務的種類和各自的區別?

spring支援
程式設計式事務管理
宣告式事務管理
兩種方式:

1.程式設計式事務管理使用TransactionTemplate
或者直接使用底層的PlatformTransactionManager。
對於程式設計式事務管理,
spring推薦使用TransactionTemplate。

2.宣告式事務管理建立在AOP之上的。
其本質是對方法前後進行攔截,
然後在目標方法開始之前建立或者加入一個事務,
在執行完目標方法之後
根據執行情況提交或者回滾事務。
宣告式事務最大的優點
就是不需要通過程式設計的方式管理事務,
這樣就不需要在業務邏輯程式碼中
摻雜事務管理的程式碼,
只需在配置檔案中
做相關的事務規則宣告
或通過基於@Transactional註解的方式
便可以將事務規則應用到業務邏輯中。

3.顯然宣告式事務管理要優於程式設計式事務管理,
這正是spring倡導的非侵入式的開發方式。
宣告式事務管理使業務程式碼不受汙染,
一個普通的POJO物件,
只要加上註解就可以獲得完全的事務支援。
和程式設計式事務相比,
宣告式事務唯一不足地方是,
後者的最細粒度只能作用到方法級別,
無法做到像程式設計式事務
那樣可以作用到程式碼塊級別。

 

139.說說spring的事務傳播行為?

spring事務的傳播行為
說的是當一個方法呼叫另一個方法時,
事務該如何操作。
1.PROPAGATION_REQUIRED:
如果當前沒有事務,
就建立一個新事務,
如果當前存在事務,
就加入該事務,
該設定是最常用的設定。

2.PROPAGATION_SUPPORTS:
支援當前事務,
如果當前存在事務,
就加入該事務,
如果當前不存在事務,
就以非事務執行。‘

3.PROPAGATION_MANDATORY:
支援當前事務,
如果當前存在事務,
就加入該事務,
如果當前不存在事務,
就丟擲異常。

4.PROPAGATION_REQUIRES_NEW:
建立新事務,
無論當前存不存在事務,
都建立新事務。

5.PROPAGATION_NOT_SUPPORTED:
以非事務方式執行操作,
如果當前存在事務,
就把當前事務掛起。

6.PROPAGATION_NEVER:
以非事務方式執行,
如果當前存在事務,
則丟擲異常。

7.PROPAGATION_NESTED:
如果當前存在事務,
則在巢狀事務內執行。
如果當前沒有事務,
則執行與PROPAGATION_REQUIRED類似的操作。

 

140.Spring事務的實現方式和實現原理

1.劃分處理單元——IOC:
由於spring解決的問題是
對單個數據庫進行區域性事務處理的,
具體的實現首相用spring中的IOC
劃分了事務處理單元。
並且將對事務的各種配置
放到了ioc容器中
設定事務管理器,
設定事務的傳播特性及隔離機制。

2.AOP攔截需要進行事務處理的類:

Spring事務處理模組
是通過AOP功能來實現宣告式事務處理的,
具體操作
比如事務實行的配置和讀取,
事務物件的抽象,
用TransactionProxyFactoryBean介面
來使用AOP功能,
生成proxy代理物件,
通過TransactionInterceptor完成
對代理方法的攔截,
將事務處理的功能
編織到攔截的方法中。 

讀取ioc容器事務配置屬性,
轉化為spring事務處理
需要的內部資料結構
TransactionAttributeSourceAdvisor
轉化為TransactionAttribute表示的資料物件。 

3.對事物處理實現
事務的生成、提交、回滾、掛起:

spring委託給具體的事務處理器實現。
實現了一個抽象和適配。
適配的具體事務處理器:
DataSource資料來源支援、
hibernate資料來源事務處理支援、
JDO資料來源事務處理支援,
JPA、JTA資料來源事務處理支援。
這些支援都是通過設計PlatformTransactionManager、
AbstractPlatforTransaction
一系列事務處理的支援。
為常用資料來源支援提供了
一系列的TransactionManager。

結合:
PlatformTransactionManager實現了
TransactionInterception介面,
讓其與TransactionProxyFactoryBean結合起來,
形成一個Spring宣告式事務處理的設計體系。