1. 程式人生 > 實用技巧 >一些SpringMVC常問的面試題

一些SpringMVC常問的面試題


SpringMVC執行流程及原理?
使用者發起請求到前端控制器(DispatcherServlet),該控制器會過濾出哪些請求可以訪問Servlet、哪些不能訪問。就是url-pattern的作用,並且會載入SpringMVC.xml配置檔案。
前端控制器會找到處理器對映器(HandlerMapping),通過HandlerMapping完成url到controller對映的元件,簡單來說,就是將在SpringMVC.xml中配置的或者註解的url與對應的處理類找到並進行儲存,用Map這樣的方式來儲存。
HandlerMapping有了對映關係,並且找到url對應的處理器,HandlerMapping就會將其處理器(Handler)返回,在返回前,會加上很多攔截器。
DispatcherServlet拿到Handler後,找到HandlerAdapter(處理器介面卡),通過它來訪問處理器,並執行處理器。
執行處理器會返回一個ModelAndView物件給HandlerAdapter。
通過HandlerAdapter將ModelAndView物件返回給前端控制器(DispatcherServlet)。
前端控制器請求檢視解析器(ViewResolver)去進行檢視解析,根據邏輯檢視名解析成真正的檢視(jsp),其實就是將ModelAndView物件中存放檢視的名稱進行查詢,找到對應的頁面形成檢視物件,返回檢視物件到前端控制器。
檢視渲染,就是將ModelAndView物件中的資料放到request域中,用來讓頁面載入資料的。

依賴注入是什麼?
依賴注入(DependencyInjection)和控制反轉(InversionofControl)是同一個概念。具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個Java例項,被呼叫者)的協助時,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項。但在Spring裡,建立被呼叫者的工作不再由呼叫者來完成,因此稱為控制反轉;建立被呼叫者例項的工作通常由Spring容器來完成,然後注入呼叫者,因此也稱為依賴注入。

用靜態方法寫測試用例時如何獲取服務的例項
繼承AbstractJUnit4SpringContextTests。
引入ApplicationContext。

新增筆者微信,獲取全部MVC面試題及答案,還有更多面試專題文件!!!

Bean注入後執行初始化程式碼的途徑
可以在XML配置bean時,指定init-method屬性即可。
需要在需要執行的方法上新增@PostConstruct註解即可。

AOP的原理
切面:攔截器類,其中會定義切點以及通知。
切點:具體攔截的某個業務點。
通知:切面當中的方法,宣告通知方法在目標業務層的執行位置,通知型別如下:
前置通知:@Before在目標業務方法執行之前執行
後置通知:@After 在目標業務方法執行之後執行
返回通知:@AfterReturning 在目標業務方法返回結果之後執行
異常通知:@AfterThrowing 在目標業務方法丟擲異常之後
環繞通知:@Around 功能強大,可代替以上四種通知,還可以控制目標業務方法是否執行以及何時執行

攔截器和過濾器的區別
過濾器(Filter):
依賴於servlet容器。
在實現上,基於函式回撥,它可以對幾乎所有請求進行過濾,但是缺點是一個過濾器例項只能在容器初始化時呼叫一次。使用過濾器的目的,是用來做一些過濾操作,獲取我們想要獲取的資料,比如:在Javaweb中,對傳入的request、response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者Controller進行業務邏輯操作。通常用的場景是:在過濾器中修改字元編碼(CharacterEncodingFilter)、在過濾器中修改HttpServletRequest的一些引數(XSSFilter(自定義過濾器)),如:過濾低俗文字、危險字元等。

攔截器(Interceptor):
依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。
在實現上,基於Java的反射機制,屬於面向切面程式設計(AOP)的一種運用,就是在service或者一個方法前,呼叫一個方法,或者在方法後,呼叫一個方法,比如動態代理就是攔截器的簡單實現,在呼叫方法前打印出字串(或者做其它業務邏輯的操作),也可以在呼叫方法後打印出字串,甚至在丟擲異常的時候做業務邏輯的操作。由於攔截器是基於web框架的呼叫,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器例項在一個controller生命週期之內可以多次呼叫。但是缺點是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理。

攔截器(Interceptor)是基於Java的反射機制,而過濾器(Filter)是基於函式回撥。從靈活性上說攔截器功能更強大些,Filter能做的事情,都能做,而且可以在請求前,請求後執行,比較靈活。
Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的引數、安全校驗(比較泛的,比如登入不登入之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。

Spring IOC和AOP的原理?
控制反轉(IOC)與依賴注入(DI)是同一個概念,目的在於降低系統偶爾,將類的例項化工作轉交給Spring代理,主要用到的設計模式為工廠模式,通過Java反射機制實現類的自動注入。
AOP意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。

SpringBoot是什麼?
用來簡化Spring應用的初始搭建以及開發過程,使用特定的方式來進行配置(properties或yml檔案)
建立獨立的Spring引用程式main方法執行。
嵌入的Tomcat無需部署war檔案。
簡化Maven配置。
自動配置Spring新增對應功能Starter自動化配置。

SpringBoot常用的Starter有哪些?
spring-boot-starter-web:tomcat和web開發需要servlet與jsp支援。
spring-boot-starter-data-jpa:資料庫支援。
spring-boot-starter-data-redis:redis資料庫支援。
spring-boot-starter-data-solr:solr支援。
mybatis-spring-boot-starter:第三方的MyBatis整合Starter。

新增筆者微信,獲取全部MVC面試題及答案,還有更多面試專題文件!!!

SpringBoot自動配置的原理?
在Spring程式main方法中新增@SpringBootApplication或者@EnableAutoConfiguration會自動去Maven中讀取每個Starter中的spring.factories檔案該檔案裡配置了所有需要被建立Spring容器中的bean。

SpringBoot讀取配置檔案的方式?
SpringBoot預設讀取配置檔案為application.properties或者是application.yml。

SpringBoot整合MyBatis的過程?
新增MyBatis的依賴:

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>`