1. 程式人生 > >spring面試知識點

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的知識點、面試的考點,本篇文章之後還會更新,覺得有什麼遺漏的地方還請指點