spring面試知識點
上一篇講的是虛擬機器的知識點,那接下來我們就說說spring.
spring我之前只會用,但是他是怎麼一回事我還真不知道,這回也算是惡補了一下基礎
我們先整個的說一遍,其中如果這些都記住了 那面試就沒什麼問題了,因為面試題問的就是這些
首先我們說一下什麼是spring
Spring 是開源的IOC和AOP容器框架。(對 就這一句話,對Spring的定義)
接下來一個套路 說它的特點、優點:
1.低侵入式設計,程式碼汙染極低(允許自由選擇和組裝Spring框架的各個功能模組,並且不強制要求必須從Spring框架的系統API的某個類來繼承或者實現某個介面)
2.spring的AOP 可以很容易的實現許可權攔截、監控等功能
3.支援單例模式
4.對主流框架提供整合支援 例如mybatis、hibernate
5.獨立於各個應用伺服器(它自己就可以執行)
下面說說AOP
什麼是aop呢
AOP其實就是面向切面程式設計,通俗的說就是在不影響原有功能的基礎上,新增一些新的功能,它實現的關鍵在於AOP框架自動建立的AOP代理
AOP代理分為兩種 靜態代理(AspectJ)和動態代理(Spring AOP).
1.靜態代理 靜態代理就是在AOP框架在編譯的過程中產生了AOP代理類,因此也稱為編譯時增強。他會在編譯階段將AspectJ織入到Java位元組碼中,執行的時候就是增強之後的AOP物件。
2.動態代理 動態代理不會去修改位元組碼檔案,而是在每次執行的過程中 在記憶體中臨時生成一個AOP物件,這個物件包含了目標類的所有方法,並在特定的切點做增強處理,並回調原物件方法
動態代理有兩種①JDK動態代理 ②GCLIB動態代理
①JDK動態代理其實就是通過反射來接收被代理類,並要求被代理類實現一個介面(什麼介面?InvocationHandler介面),如果沒有實現介面,那Spring就會選擇GCLIB作為代理類
②GCLIB動態代理說白了其實就是一個類庫,可以在執行時動態的生成指定類的一個子類物件,並覆蓋其中特定方法,再覆蓋方法的時候進行增強,從而實現AOP。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那麼它是無法使用CGLIB做動態代理的。
靜態代理與動態代理區別在於生成AOP代理物件的時機不同,一般來說靜態代理方式具有更好的效能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理
AOP其實也就是這些
下面我們說下IOC
IOC 其實就是控制反轉 (類與類之間的依賴關係,不用再具體類中建立,而是交給spring去管理)
Spring的三種注入方式:(1)setter注入 (2)構造器注入 (3)註解注入
(1)setter注入①在配置檔案中bean下有property標籤注入 ②在java類中setter
(2)構造器注入①在配置檔案中bean下有consturtor-arg標籤注入 ②在java類中宣告構造器
(3)註解注入 ①註冊bean的註解有[email protected]註冊全部bean [email protected]註冊控制層bean [email protected]註冊服務層bean [email protected] 註冊dao層bean
Spring怎麼使用事物?
1.配置檔案裡面<tx:advice>標籤
2.java中宣告@transcational
BeanFactory和ApplicationContext有什麼區別?
1.BeanFactory和ApplicationContext是Spring的兩大核心介面
2.BeanFactory是Spring裡面最底層的介面,提供了最簡單的容器的功能,負責讀取bean配置文件,管理bean的載入與例項化,維護bean之間的依賴關係,負責bean的生命週期,但是無法支援spring的aop功能和web應用
ApplicationContext介面作為BeanFactory的派生,因而具有BeanFactory所有的功能。而且ApplicationContext還在功能上做了擴充套件:①預設初始化所有的Singleton,也可以通過配置取消預初始化。
②繼承MessageSource,因此支援國際化
③同時載入多個配置檔案
④以宣告式方式啟動並建立Spring容器。
3.BeanFactroy採用的是延遲載入形式來注入Bean的,只有在使用到某個Bean時,才會去建立,這樣我們就不能發現一些存在的Spring的配置問題。如果Bean的某一個屬性沒有注入,BeanFacotry載入後,直至第一次使用呼叫getBean方法才會丟擲異常
而ApplicationContext則相反,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤,ApplicationContext啟動後預載入所有的單例項Bean,通過預載入單例項bean ,確保當你需要的時候,你就不用等待,因為它們已經建立好了
解釋Spring支援的幾種bean的作用域。
Spring容器中的bean可以分為5個範圍:
(1)singleton:這種bean範圍是預設的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的例項,單例的模式由bean factory自身來維護。 (2)prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個例項。 (3)request:在請求bean範圍內會每一個來自客戶端的網路請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。 (4)Session:與請求範圍類似,確保每個session中有一個bean的例項,在session過期後,bean會隨之失效。 (5)global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要宣告讓所有的portlet共用全域性的儲存變數的話,那麼這全域性變數需要儲存在global-session中。全域性作用域與Servlet中的session作用域效果相同。 以上大概是我總結的一些關於Spring的知識點、面試的考點,本篇文章之後還會更新,覺得有什麼遺漏的地方還請指點