1使用Spring框架的優點是什麼?
控制反轉: Spring通過控制反轉實現了鬆散耦合,物件們給出它們的依賴,而不是建立或查詢依賴的物件們。
面向切面的程式設計(AOP): Spring支援面向切面的程式設計。而且把應用業務邏輯和系統服務分開。
容器: Spring 包括並管理應用中物件的生命週期和配置。
事務管理: Spring 提供一個持續的事務管理介面。能夠擴充套件到上至本地事務下至全域性事務(JTA)。
異常處理: Spring 提供方便的API把詳細技術相關的異常(比方由JDBC。Hibernate or JDO丟擲的)轉化為一致的unchecked 異常。
2.說說AOP和IOC/DI的概念以及在spring中是怎樣應用的?
AOP,Aspect Oriented Program。面向(方面)切面的程式設計;
IOC,Invert Of Control。控制反轉。
物件的例項由容器自己主動生成,
即用介面程式設計,在程式中不出現newkeyword,而是用介面來命名引用。
然後通過某種方式把介面的某個實現類的例項注入到引用裡。從而實現介面與詳細實現類的鬆耦合。
由容器控制程式之間的關係(通過XML配置)。而非傳統實現中的由程式程式碼直接操控,
依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用建立物件。而僅僅須要描寫敘述它怎樣被建立。你不在程式碼裡直接組裝你的元件和服務,可是要在配置檔案中描寫敘述哪些元件須要哪些服務,之後一個容器(IOC容器)負責把他們組裝起來。簡單說一下,IOC就是事實上就是依賴注入,(在一個Class物件中引用還有一個Class物件時,我們通常都是直接通過new contructor)。
控制權由應用程式碼中轉到了外部容器,控制權的轉移。是所謂的反轉。
AOP方式非常相似filter,就是在程式正常的業務流中間像切面一樣插入非常多其它須要執行的程式碼,
比方登入時候。在進入登入頁面前寫入日誌,非經常常使用的,尤其是跟資料庫有關的,或者跟支付有關的程式肯定會在每一
步前面插入日誌。
面向方面的程式設計,即 AOP,是一種程式設計技術,它同意程式猿對橫切關注點或橫切典型的職責分界線的行為(比如日誌和事務管理)進行模組化。
AOP 的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模組中。
AOP Advice(AOP通知)分為:
前置通知 後置通知 異常通知 圍繞通知
IOC/DI。IOC反射機制 ,AOP動態代理
3:Spring的事物有幾種方式?Spring框架的事務管理有哪些優點? 你更傾向用那種事務管理型別?談談spring事物的隔離級別和傳播行為?
程式設計式事務管理:這意味你通過程式設計的方式管理事務,給你帶來極大的靈活性,可是難維護。
宣告式事務管理:這意味著你能夠將業務程式碼和事務管理分離。你僅僅需用註解和XML配置來管理事務。
它為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的程式設計模式。
它為程式設計式事務管理提供了一套簡單的API而不是一些複雜的事務API如
它支援宣告式事務管理。
它和Spring各種資料訪問抽象層非常好得整合。
大多數Spring框架的使用者選擇宣告式事務管理,由於它相應用程式碼的影響最小,
因此更符合一個無侵入的輕量級容器的思想。
宣告式事務管理要優於程式設計式事務管理。
儘管比程式設計式事務管理(這樣的方式同意你通過程式碼控制事務)少了一點靈活性。
事務的隔離級別:
資料庫系統提供了4種事務隔離級別。在這4種隔離級別中,Serializable的隔離級別最高。Read Uncommitted的隔離級別最低;
· Read Uncommitted 讀未提交資料。(會出現髒讀)
· Read Committed 讀已提交資料;
· Repeatable Read 可反覆讀;
事務的傳播屬性包括:
· Required業務方法須要在一個事務中執行。假設一個方法執行時已經處在一個事務中,那麼增加到該事務,否則為自己建立一個新事務。 80%的方法用到該傳播屬性。
· Not-Supported· Requiresnew· Mandatoky· Supports· Never· Nested
Readonly提高查詢效率。快取,查詢等做快取沒有意義
4: 解釋Spring框架中bean的生命週期及Spring支援的幾種作用域
答:
Spring容器 從XML 檔案中讀取bean的定義。並例項化bean。Spring依據bean的定義填充全部的屬性。
假設bean實現了BeanNameAware 介面,Spring 傳遞bean 的ID 到 setBeanName方法。
假設Bean 實現了 BeanFactoryAware 介面, Spring傳遞beanfactory 給setBeanFactory 方法。
假設有不論什麼與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內呼叫它們。
假設bean實現IntializingBean了。呼叫它的afterPropertySet方法。
假設bean宣告瞭初始化方法,呼叫此初始化方法。
假設有BeanPostProcessors 和bean 關聯。這些bean的postProcessAfterInitialization() 方法將被呼叫。
假設bean實現了 DisposableBean,它將呼叫destroy()方法。
Spring框架支援下面五種bean的作用域:
singleton : bean在每一個Spring ioc 容器中僅僅有一個例項。
prototype:一個bean的定義能夠有多個例項。
request:每次http請求都會建立一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中。一個bean定義相應一個例項。
該作用域僅在基於web的Spring ApplicationContext情形下有效。
global-session:在一個全域性的HTTP Session中。一個bean定義相應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
5:面向切面的原理
答:
物件導向的程式設計主要注重核心業務,而面向切面程式設計主要關注一些不是核心的業務,但又是必須的輔助功能。
就是把那些不是核心業務應該處理的程式碼提取出來,進行封裝成模組化.來處理那些附加的功能程式碼(如日誌。事務,安全驗證)我們把這個模組的作用理解為一個切面,告訴我們它是一個功能模組.我們能夠把它看成一個切面.說白了就是我們寫一個類,在這個類中寫一些處理在核心業務中起到相同效果的方法.
我們還要了解兩個keyword:
連線點(Joinpoint),簡單的理解就是在切面模組中定義的方法.就是上面定義類中的方法.
切入點(Pointcut).就是連線點的集合,就是一組方法的集合了. 下面幾個就比較理解了。目標物件就是要處理的核心業務了.代理就更easy理解了,讓一個代理去完畢這個任務.
關於AOP程式設計可關注我另外一篇部落格:
Spring AOP 學習之動態動態代理