Spring知識點

一、Spring是什麼?spring

 
Spring是一個輕量級的IoC和AOP容器框架。是爲Java應用程序提供基礎性服務的一套框架,目的是用於簡化企業應用程序的開發,它使得開發者只須要關心業務需求。常見的配置方式有三種:基於XML的配置、基於註解的配置、基於Java的配置。
主要由如下幾個模塊組成:
Spring Core:核心類庫,提供IOC服務;
Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);
Spring AOP:AOP服務;
Spring DAO:對JDBC的抽象,簡化了數據訪問異常的處理;
Spring ORM:對現有的ORM框架的支持;
Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;
Spring MVC:提供面向Web應用的Model-View-Controller實現。
 
 
二、Spring的 IOC理解
IOC是一種叫作「控制反轉」的設計思想。將對象的建立、維護、銷燬等生命週期的控制由程序控制改成IOC容器控制。依賴注入是IOC的重要實現,經過依賴注入解決對象耦合關係。Spring IOC容器負責建立對象,管理對象,裝配對象,配置對象,並管理這些對象的生命週期。經過IOC機制能夠把應用代碼量下降,使程序鬆散耦合得以實現。
 
三、Spring的 AOP理解
 
AOP稱爲面向方面(切面)編程,將那些與業務無關,卻被業務模塊共同調用的邏輯提取並封裝起來,減小了系統中的重複代碼,下降了模塊間的耦合度,同時提升了系統的可維護性。可用於數據庫字段加解密,權限認證、日誌、事務處理。

AOP實現的關鍵在於AOP框架自動建立的AOP代理,AOP代理主要分爲靜態代理和動態代理。靜態代理的表明爲AspectJ;動態代理則以Spring AOP爲表明。數據庫

(1)AspectJ是靜態代理的加強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,所以也稱爲編譯時加強,他會在編譯階段將AspectJ織入到Java字節碼中,運行的時候就是加強以後的AOP對象。編程

(2)Spring AOP使用的動態代理,是每次運行時在內存中臨時爲方法生成一個AOP對象,這個AOP對象包含了目標對象的所有方法,而且在特定的切點作了加強處理,並回調原對象的方法。安全

 

Spring AOP中的動態代理主要JDK動態代理和CGLIB動態代理:多線程

        ①JDK動態代理經過反射來接收被代理的類,而且要求被代理的類必須實現一個接口。JDK動態代理的核心是InvocationHandler接口和Proxy類。Object invoke(Object var1, Method var2, Object[] var3);第一個參數代理對象,第二個爲目標方法,第三個爲參數。併發

        ②若是目標類沒有實現接口,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB是一個代碼生成的類庫,能夠在運行時動態的生成指定類的一個子類對象,並覆蓋其中特定方法,覆蓋方法時能夠添加加強代碼,從而實現AOP。CGLIB是經過繼承的方式作的動態代理,所以若是某個類被標記爲final,那麼它是沒法使用CGLIB作動態代理的。mvc

(3)靜態代理與動態代理區別在於生成AOP代理對象的時機不一樣,相對來講AspectJ的靜態代理方式具備更好的性能,可是AspectJ須要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理框架

 

四、Spring Bean生命週期性能

 
  
  
 

五、Spring中的BeanFactory與ApplicationContext的做用和區別?spa

    
    BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係,負責bean的聲明週期。採用延遲加載的,只有getBean時纔會初始化
   ApplicationContext是BeanFactory的派生類,容器啓動時所有初始化,除了提供上述BeanFactory所能提供的功能以外,還提供了更完整的框架功能:
1.MessageSource,提供對i18n消息的訪問;
2.資源訪問,好比URL和文件;
3.事件傳遞給實現了ApplicationListener接口的bean;
          4. 同時加載多個配置文件
 

六、Spring mvc 工做流程:

 
      
 
 

七、Spring如何處理線程併發問題?

 
在通常狀況下,只有無狀態的Bean才能夠在多線程環境下共享,在Spring中,絕大部分Bean均可以聲明爲singleton做用域,由於Spring對一些Bean中非線程安全狀態採用ThreadLocal進行處理,解決線程安全問題。
ThreadLocal和線程同步機制都是爲了解決多線程中相同變量的訪問衝突問題。同步機制採用了「時間換空間」的方式,僅提供一份變量,不一樣的線程在訪問前須要獲取鎖,沒得到鎖的線程則須要排隊。而ThreadLocal採用了「空間換時間」的方式。
ThreadLocal會爲每個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問衝突。由於每個線程都擁有本身的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,能夠把不安全的變量封裝進ThreadLocal。
 

八、Spring事務的傳播行爲:

 
    Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是沒法提供事務功能的。真正的數據庫層的事務提交和回滾是經過binlog或者redo log實現的。
    spring支持編程式事務管理和聲明式事務管理兩種方式:
    spring的事務傳播行爲:

① PROPAGATION_REQUIRED:若是當前沒有事務,就建立一個新事務,若是當前存在事務,就加入該事務,該設置是最經常使用的設置。② PROPAGATION_SUPPORTS:支持當前事務,若是當前存在事務,就加入該事務,若是當前不存在事務,就以非事務執行。‘③ PROPAGATION_MANDATORY:支持當前事務,若是當前存在事務,就加入該事務,若是當前不存在事務,就拋出異常。④ PROPAGATION_REQUIRES_NEW:建立新事務,不管當前存不存在事務,都建立新事務。⑤ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。⑥ PROPAGATION_NEVER:以非事務方式執行,若是當前存在事務,則拋出異常。

⑦ PROPAGATION_NESTED:若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則按REQUIRED屬性執行。
 
 

九、Spring通知有哪些類型?

 
(1)前置通知(Before advice):在某鏈接點(join point)以前執行的通知,但這個通知不能阻止鏈接點前的執行(除非它拋出一個異常)。
(2)返回後通知(After returning advice):在某鏈接點(join point)正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。 
(3)拋出異常後通知(After throwing advice):在方法拋出異常退出時執行的通知。 
(4)後通知(After (finally) advice):當某鏈接點退出的時候執行的通知(不管是正常返回仍是異常退出)。 
(5)環繞通知(Around Advice):  環繞通知能夠在方法調用先後完成自定義的行爲。
相關文章
相關標籤/搜索