撩課-Java每天5道面試題第21天
阿新 • • 發佈:2018-12-17
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宣告式事務處理的設計體系。