面試——Spring+SpringMVC
1、Spring是什麽,都有那些模塊?
Spring是一個開源框架,它幫助開發者解決了開發中基礎性的問題,使得開發人員可以專註於應用程序的開發。
Spring框架至今已集成了20多個模塊。這些模塊主要被分如下圖所示的核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊。
IOC就是控制反轉,我們把創建對象的權利交給框架,當我們需要使用的時候通過依賴註入給我們;
AOP就是面向切面編程,它的主要思想是將橫向重復代碼縱向抽取出來,Spring通過JDK動態代理(必須實現同一接口,優先)和cglib代理來實現AOP(只要能繼承就行)。
-
各個步驟之間的良好隔離性耦合性大大降低
-
源代碼無關性,再擴展功能的同時不對源碼進行修改操作
2、Spring常見創建對象的註解?
@Component@Controller@ Service@ Repository
3、Spring中用到的設計模式
答:簡單工廠、工廠方法、單例模式、適配器、包裝器、代理、觀察者、策略、模板方法
4、Spring的優點?
- 1.降低了組件之間的耦合性,實現了軟件各層之間的解耦(IOC,對象是通過反射創建的)
- 2.可以使用提供的眾多服務,如事務管理,消息服務等
- 3.容器提供單例模式支持 (好處:節省系統資源)
- 4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能
- 5.容器提供了眾多的輔助類,能加快應用的開發
- 6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
- 7.spring屬於低侵入式設計,代碼的汙染極低
- 8.獨立於各種應用服務器
- 9.spring的DI機制降低了業務對象替換的復雜性
- 10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring 的部分或全部
5、Spring Bean的作用域之間有什麽區別?
Spring容器中的bean可以分為5個範圍。所有範圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:
singleton:這種bean範圍是默認的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的實例,單例的模式由bean factory自身來維護。
prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個實例。
request:在請求bean範圍內會每一個來自客戶端的網絡請求創建一個實例,在請求完成以後,bean會失效並被垃圾回收器回收。
Session:與請求範圍類似,確保每個session中有一個bean的實例,在session過期後,bean會隨之失效。
global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那麽這全局變量需要存儲在global-session中。
全局作用域與Servlet中的session作用域效果相同。
6、Spring管理事務有幾種方式?
答:有兩種方式:
1、編程式事務,在代碼中硬編碼。(不推薦使用)
2、聲明式事務,在配置文件中配置(推薦使用)
聲明式事務又分為兩種:
- a、基於XML的聲明式事務
- b、基於註解的聲明式事務
7、spring中自動裝配的方式有哪些?
答:1、 No:即不啟用自動裝配。
2、 byName:通過屬性的名字的方式查找JavaBean依賴的對象並為其註入。比如說類Computer有個屬性printer,指定其autowire屬性為byName後,Spring IoC容器會在配置文件中查找id/name屬性為printer的bean,然後使用Seter方法為其註入。
3、 byType:通過屬性的類型查找JavaBean依賴的對象並為其註入。比如類Computer有個屬性printer,類型為Printer,那麽,指定其autowire屬性為byType後,Spring IoC容器會查找Class屬性為Printer的bean,使用Seter方法為其註入。
4、 constructor:通byType一樣,也是通過類型查找依賴對象。與byType的區別在於它不是使用Seter方法註入,而是使用構造器註入。
5、 autodetect:在byType和constructor之間自動的選擇註入方式。
6、 default:由上級標簽<beans>的default-autowire屬性確定。
8、spring中的核心類有那些,各有什麽作用?
答:BeanFactory:產生一個新的實例,可以實現單例模式
BeanWrapper:提供統一的get及set方法
ApplicationContext:提供框架的實現,包括BeanFactory的所有功能
9、Bean的調用方式有哪些?
答:有三種方式可以得到Bean並進行調用:
3、使用ApplicationContext(根據配置文件創建Spring容器,然後獲取bean)
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
10、什麽是IOC,什麽又是DI,他們有什麽區別?
答:依賴註入DI是一個程序設計模式和架構模型, 一些時候也稱作控制反轉,盡管在技術上來講,依賴註入是一個IOC的特殊實現,依賴註入是指一個對象應用另外一個對象來提供一個特殊的能力,例如:把一個 數據庫連接已參數的形式傳到一個對象的結構方法裏面而不是在那個對象內部自行創建一個連接。控制反轉和依賴註入的基本思想就是把類的依賴從類內部轉化到外 部以減少依賴
應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被註入到對象中。所 以,控制反轉是,關於一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。
11、spring有兩種代理方式:
答: 若目標對象實現了若幹接口,spring使用JDK的java.lang.reflect.Proxy類代理。
優點:因為有接口,所以使系統更加松耦合
缺點:為每一個目標類創建接口
若目標對象沒有實現任何接口,spring使用CGLIB庫生成目標對象的子類。
優點:因為代理類與目標類是繼承關系,所以不需要有接口的存在。
缺點:因為沒有使用接口,所以系統的耦合性沒有使用JDK的動態代理好。
12、springMVC的流程(請求生命周期)?
- 1、 用戶發送請求至前端控制器DispatcherServlet
- 2、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 3、 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一並返回給DispatcherServlet。
- 4、 DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
- 5、 執行處理器(Controller,也叫後端控制器)。
- 6、 Controller執行完成返回ModelAndView
- 7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
- 8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- 9、 ViewReslover解析後返回具體View
- 10、 DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
- 11、 DispatcherServlet響應用戶
13、Springmvc的優點
1.它是基於組件技術的.全部的應用對象,無論控制器和視圖,還是業務對象之類的都是 java組件.並且和Spring提供的其他基礎結構緊密集成.
2.不依賴於Servlet API(目標雖是如此,但是在實現的時候確實是依賴於Servlet的)
3.可以任意使用各種視圖技術,而不僅僅局限於JSP
4.支持各種請求資源的映射策略
5.它應是易於擴展的
面試——Spring+SpringMVC