問:SpringIOC原理闡述
答:把對象的建立、初始化、銷毀等工作交給Spring容器來完成。我們可以把IOC容器的工作模式看做是工廠模式的升華,可以把IOC容器看作是一個工廠,這個工廠裡要生産的對象都在配置檔案中給出定義,然後利用程式設計語言的的反射程式設計,根據配置檔案中給出的類名生成相應的對象。從實作來看,IOC是把以前在工廠方法裡寫死的對象生成代碼,改變為由配置檔案來定義,也就是把工廠和對象生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。
問:SpringAOP原理
答:1)面向對象的設計沒有辦法解決重複代碼的問題
2)SpringAOP使用動态代理技術在運作期植入增強的代碼,aspectj是在編譯器織入橫切代碼的形式來實作代理技術的
3)SpringAOP使用了兩種代理機制,一種是基于JDK的動态代理,一種是基于CGLib的動态代理
4)JDK1.3以後java提供了動态代理的技術,運作開發者在運作期建立接口的代理執行個體
5)jdk的動态代理主要涉及java.lang.reflect包中的兩個類ProxyInvcoationHandler
6)InvcoationHandler是一個接口,通過實行該接口可以訂閱橫切邏輯,并通過反射機制調用目标類的代碼,動态講橫切邏輯和業務邏輯編織在一起
7)Proxy利用InvocationHandler動态建立一個符号某一接口的執行個體,生成目标類的代理對象
8)cglib采用非常底層的位元組碼技術,可以為一個類建立子類,并在子類中采用方法攔截技術攔截所有的父類方法的調用,并順勢織入橫切邏輯
問:AOP中的概念解釋
答:切面:Aspect,連接配接點:Joinpoint,增強:Advice,切入點:Pointcut,目标對象:Target,代理:Proxy,其中增強包括:前置增強,後置增強,傳回會增強,環繞增強,抛出異常後增強
問:使用SpringAOP可以基于兩種方式
答:一種是比較友善和強大的注解方式,使用注解配置SpringAOP總體分為兩步,第一步是在xml檔案中聲明激活自動掃描元件功能,同時激活自動代理功能,一種則是中規中矩的xml配置方式
問:Spring的事務傳播機制
答:1)REQUIRED(預設):支援使用目前事務,如果目前事務不存在,建立一個新事務。
2)SUPPORTS:支援使用目前事務,如果目前事務不存在,則不使用事務。
3)MANDATORY:中文翻譯為強制,支援使用目前事務,如果目前事務不存在,則抛出Exception。
4)REQUIRES_NEW:建立一個新事務,如果目前事務存在,把目前事務挂起。
5)NOT_SUPPORTED:無事務執行,如果目前事務存在,把目前事務挂起。
6)NEVER:無事務執行,如果目前有事務則抛出Exception。
7)NESTED:嵌套事務,如果目前事務存在,那麼在嵌套的事務中執行。如果目前事務不存在,則表現跟REQUIRED一樣。
問:Spring的事務實作方式
答:1)程式設計式事務管理對基于POJO的應用來說是唯一選擇。我們需要在代碼中調用beginTransaction()、commit()、rollback()等事務管理相關的方法,這就是程式設計式事務管理。
2)基于TransactionProxyFactoryBean的聲明式事務管理
3)基于@Transactional的聲明式事務管理
4)基于AspectjAOP配置事務
問:Spring通過單執行個體化Bean簡化多線程問題
答:由于Spring的事務管理器是通過線程相關的ThreadLocal來儲存資料通路基礎設施(也即Connection執行個體),web容器本身就是多線程的,web容器為一個http請求建立一個獨立的線程(實際大多數采用線程池),是以bean也是運作在多線程的環境下,在大多數情況下,Spring的bean都是單例的,單例的好處就是線程無關性,不存在多線程并發問題,Spring是通過ThreadLocal将有狀态的變量本地線程化,達到另一個層面上的線程無關。
問:SpringMVC工作原理
答:SpringMVC架構圍繞dispactcherServlet這個核心展開,dispatcherServlet是SpringMVC的總導演,總策劃,他負責攔截請求并将器分派給響應的處理器處理。SpringMVC架構包括注解驅動控制器,請求及響應的資訊處理,表單标簽綁定,視圖解析,本地化解析,上傳檔案解析,異常處理。
SpringMVC通過一個前端servlet接收所有的請求,并将具體工作委托給其他元件進行處理
1)整個過程開始于用戶端發送一個HTTP請求,如果比對web.xml的映射路徑,則進行處理
2)DispatcherServlet根據HandlerMapping找到對應的Handler,将處理權交給Handler
3)HandlerAdapter這個擴充卡對各種Hander方法進行調用
4)處理完了之後傳回一個ModelAndView給DispatcherServelt
5)Handler傳回的ModelAndView()隻是一個邏輯視圖并不是一個正式的視圖,DispatcherSevlet通過ViewResolver将邏輯視圖轉化為真正的視圖View
6)根據ModelAndView對模型資料進行視圖渲染
7)最終用戶端得到相應消息,可能是一個普通的HTML頁面,也可能是一個XML或者JSON串
問:SpringMVC和Struts2的差別
答:1)攔截機制的不同
Struts2是類級别的攔截,每次請求就會建立一個Action,和Spring整合時Struts2的ActionBean注入作用域是原型模式prototype,然後通過setter,getter吧request資料注入到屬性。Struts2中,一個Action對應一個request,response上下文,在接收參數時,可以通過屬性接收,這說明屬性參數是讓多個方法共享的。Struts2中Action的一個方法可以對應一個url,而其類屬性卻被所有方法共享,這也就無法用注解或其他方式辨別其所屬方法了,隻能設計為多例。
SpringMVC是方法級别的攔截,一個方法對應一個Request上下文,是以方法直接基本上是獨立的,獨享request,response資料。而每個方法同時又何一個url對應,參數的傳遞是直接注入到方法中的,是方法所獨有的。處理結果通過ModeMap傳回給架構。在Spring整合時,SpringMVC的ControllerBean預設單例模式Singleton,是以預設對所有的請求,隻會建立一個Controller,有應為沒有共享的屬性,是以是線程安全的,如果要改變預設的作用域,需要添加@Scope注解修改。
Struts2有自己的攔截Interceptor機制,SpringMVC這是用的是獨立的AOP方式,這樣導緻Struts2的配置檔案量還是比SpringMVC大。
2)底層架構的不同
Struts2采用Filter(StrutsPrepareAndExecuteFilter)實作,SpringMVC(DispatcherServlet)則采用Servlet實作。Filter在容器啟動之後即初始化;服務停止以後墜毀,晚于Servlet。Servlet在是在調用時初始化,先于Filter調用,服務停止後銷毀。
3)性能方面
Struts2是類級别的攔截,每次請求對應執行個體一個新的Action,需要加載所有的屬性值注入,SpringMVC實作了零配置,由于SpringMVC基于方法的攔截,有加載一次單例模式bean注入。是以,SpringMVC開發效率和性能高于Struts2。
4)配置方面
SpringMVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高。