精華:關(guān)于Spring的15點(diǎn)總結(jié)
1.Spring 中 AOP 的應(yīng)用場景、Aop 原理、好處?
答:AOP 用來封裝橫切關(guān)注點(diǎn),具體可以在下面的場景中使用: Authentication 權(quán)限、Caching緩存、Contextpassing內(nèi)容傳遞、Errorhandling錯(cuò)誤處理 Lazy loading 懶加載、Debugging 調(diào)試、logging,tracing,profilingandmonitoring 記錄跟蹤優(yōu)化 校準(zhǔn)、Performanceoptimization 性能優(yōu)化、Persistence持久化、Resourcepooling 資源池、 Synchronization 同步、Transactions事務(wù)
原理:AOP 是面向切面編程,是通過代理的方式為程序添加統(tǒng)一功能,集中解決一些公 共問題。
好處:1.各個(gè)步驟之間的良好隔離性 2.源代碼無關(guān)性
2.Spring 中 IOC 的作用與原理?對(duì)象創(chuàng)建的過程。
答:當(dāng)某個(gè)角色需要另外一個(gè)角色協(xié)助的時(shí)候,在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用 者來創(chuàng)建被調(diào)用者的實(shí)例。但在 spring 中創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱 為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由 spring 來完成,然后注入調(diào)用者。
IOC 本質(zhì)上是一個(gè)容器,已 MAP 對(duì) IOC 簡單舉例,服務(wù)器加載配置文件,由 xml 文檔 解析工具讀取 bean 的 ID,獲取 class,使用反射創(chuàng)建對(duì)象,以 K-V 的形式存入 MAP,K 是 ID, V 是反射創(chuàng)建的對(duì)象。獲取對(duì)象可以調(diào)用 context.getBean(K)的方式。
3.介紹 spring 框架
它是一個(gè) full-stack 框架,提供了從表現(xiàn)層到業(yè)務(wù)層再到持久層的一套完整的解決方案。我 們?cè)陧?xiàng)目中可以只使用 spring 一個(gè)框架,它就可以提供表現(xiàn)層的 mvc 框架,持久層的 Dao 框架。它的兩大核心 IoC 和 AOP 更是為我們程序解耦和代碼簡潔易維護(hù)提供了支持。
4.Spring 常見創(chuàng)建對(duì)象的注解?
答:@Component@Controller@Service@Repository
5.Spring 中用到的設(shè)計(jì)模式
答:簡單工廠、工廠方法、單例模式、適配器、包裝器、代理、觀察者、策略、模板方法 詳細(xì)介紹自己查了。
6.Spring 的優(yōu)點(diǎn)?
(1)降低了組件之間的耦合性,實(shí)現(xiàn)了軟件各層之間的解耦
(2)可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等
(3)容器提供單例模式支持
(4)容器提供了 AOP 技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截,運(yùn)行期監(jiān)控等功能
(5)容器提供了眾多的輔助類,能加快應(yīng)用的開發(fā)
(6)spring 對(duì)于主流的應(yīng)用框架提供了集成支持,如 hibernate,JPA,Struts 等
(7)spring 屬于低侵入式設(shè)計(jì),代碼的污染極低
(8)獨(dú)立于各種應(yīng)用服務(wù)器
(9)spring 的 DI 機(jī)制降低了業(yè)務(wù)對(duì)象替換的復(fù)雜性
(10)Spring 的高度開放性,并不強(qiáng)制應(yīng)用完全依賴于 Spring,開發(fā)者可以自由選擇 spring 的部分或全部
7.SpringBean 的作用域之間有什么區(qū)別?
Spring 容器中的 bean 可以分為 5 個(gè)范圍。所有范圍的名稱都是自說明的,但是為了避 免混淆,還是讓我們來解釋一下:
singleton:這種 bean 范圍是默認(rèn)的,這種范圍確保不管接受到多少個(gè)請(qǐng)求,每個(gè)容器 中只有一個(gè) bean 的實(shí)例,單例的模式由 beanfactory 自身來維護(hù)。
prototype:原形范圍與單例范圍相反,為每一個(gè) bean 請(qǐng)求提供一個(gè)實(shí)例。黑馬程序員
request:在請(qǐng)求 bean 范圍內(nèi)會(huì)每一個(gè)來自客戶端的網(wǎng)絡(luò)請(qǐng)求創(chuàng)建一個(gè)實(shí)例,在請(qǐng)求完成以 后,bean 會(huì)失效并被垃圾回收器回收。
Session:與請(qǐng)求范圍類似,確保每個(gè) session 中有一個(gè) bean 的實(shí)例,在 session 過期后, bean 會(huì)隨之失效。
global-session:global-session 和 Portlet 應(yīng)用相關(guān)。當(dāng)你的應(yīng)用部署在 Portlet 容器中工 作時(shí),它包含很多 portlet。如果你想要聲明讓所有的 portlet 共用全局的存儲(chǔ)變量的話,那 么這全局變量需要存儲(chǔ)在 global-session 中。全局作用域與 Servlet 中的 session 作用域效果相同。
8.Spring 管理事務(wù)有幾種方式?
答:有兩種方式:
(1)編程式事務(wù),在代碼中硬編碼。(不推薦使用)
(2)聲明式事務(wù),在配置文件中配置(推薦使用)聲明式事務(wù)又分為兩種:
a、基于 XML 的聲明式事務(wù)
b、基于注解的聲明式事務(wù)
9.spring 中自動(dòng)裝配的方式有哪些?
(1)No:即不啟用自動(dòng)裝配。
(2)byName:通過屬性的名字的方式查找 JavaBean 依賴的對(duì)象并為其注入。比如說類 Computer 有個(gè)屬性 printer,指定其 autowire 屬性為 byName 后,Spring IoC 容器會(huì)在配置文 件中查找 id/name 屬性為 printer 的 bean,然后使用 Seter 方法為其注入。
(3)byType:通過屬性的類型查找 JavaBean 依賴的對(duì)象并為其注入。比如類 Computer 有個(gè)屬性 printer,類型為 Printer,那么,指定其 autowire 屬性為 byType 后,SpringIoC 容 器會(huì)查找 Class 屬性為 Printer 的 bean,使用 Seter 方法為其注入。
(4)constructor:通 byType 一樣,也是通過類型查找依賴對(duì)象。與 byType 的區(qū)別在于 它不是使用 Seter 方法注入,而是使用構(gòu)造子注入。
(5)autodetect:在 byType 和 constructor 之間自動(dòng)的選擇注入方式。
(6)default:由上級(jí)標(biāo)簽<beans>的 default-autowire 屬性確定。
10.spring 中的核心類有那些,各有什么作用?
BeanFactory:產(chǎn)生一個(gè)新的實(shí)例,可以實(shí)現(xiàn)單例模式
BeanWrapper:提供統(tǒng)一的 get 及 set 方法
ApplicationContext:提供框架的實(shí)現(xiàn),包括 BeanFactory 的所有功能
11.Bean 的調(diào)用方式有哪些?
答:有三種方式可以得到 Bean 并進(jìn)行調(diào)用:
(1)使用 BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
System.out.println(bw.getPropertyCalue(”msg”));
(2)使用 BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
(3)使用 ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
12.什么是 IOC,什么又是 DI,他們有什么區(qū)別?
答:依賴注入 DI 是一個(gè)程序設(shè)計(jì)模式和架構(gòu)模型,一些時(shí)候也稱作控制反轉(zhuǎn),盡管在 技術(shù)上來講,依賴注入是一個(gè) IOC 的特殊實(shí)現(xiàn),依賴注入是指一個(gè)對(duì)象應(yīng)用另外一個(gè)對(duì)象來 提供一個(gè)特殊的能力,例如:把一個(gè)數(shù)據(jù)庫連接已參數(shù)的形式傳到一個(gè)對(duì)象的結(jié)構(gòu)方法里 面而不是在那個(gè)對(duì)象內(nèi)部自行創(chuàng)建一個(gè)連接。
控制反轉(zhuǎn)和依賴注入的基本思想就是把類的依 賴從類內(nèi)部轉(zhuǎn)化到外部以減少依賴 應(yīng)用控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所 依賴的對(duì)象的引用,傳遞給它。也可以說,依賴被注入到對(duì)象中。所以,控制反轉(zhuǎn)是,關(guān) 于一個(gè)對(duì)象如何獲取他所依賴的對(duì)象的引用,這個(gè)責(zé)任的反轉(zhuǎn)。
13.spring 有兩種代理方式:
(1)若目標(biāo)對(duì)象實(shí)現(xiàn)了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 類代理。
優(yōu)點(diǎn):因?yàn)橛薪涌冢允瓜到y(tǒng)更加松耦合
缺點(diǎn):為每一個(gè)目標(biāo)類創(chuàng)建接口
(2)若目標(biāo)對(duì)象沒有實(shí)現(xiàn)任何接口,spring 使用 CGLIB 庫生成目標(biāo)對(duì)象的子類。
優(yōu)點(diǎn):因?yàn)榇眍惻c目標(biāo)類是繼承關(guān)系,所以不需要有接口的存在。
缺點(diǎn):因?yàn)闆]有使用接口,所以系統(tǒng)的耦合性沒有使用 JDK 的動(dòng)態(tài)代理好。
14.springMVC 的流程?
(1)用戶發(fā)送請(qǐng)求至前端控制器 DispatcherServlet
(2)DispatcherServlet 收到請(qǐng)求調(diào)用 HandlerMapping 處理器映射器。
(3)處理器映射器根據(jù)請(qǐng)求 url 找到具體的處理器,生成處理器對(duì)象及處理器攔截器(如果 有則生成)一并返回給 DispatcherServlet。
(4)DispatcherServlet 通過 HandlerAdapter 處理器適配器調(diào)用處理器
(5)執(zhí)行處理器(Controller,也叫后端控制器)。
(6)Controller 執(zhí)行完成返回 ModelAndView
(7)HandlerAdapter 將 controller 執(zhí)行結(jié)果 ModelAndView 返回給 DispatcherServlet
(8)DispatcherServlet 將 ModelAndView 傳給 ViewReslover 視圖解析器
(9)ViewReslover 解析后返回具體 View
(10)DispatcherServlet 對(duì) View 進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
(11)DispatcherServlet 響應(yīng)用戶
15.Springmvc 的優(yōu)點(diǎn)
(1)它是基于組件技術(shù)的.全部的應(yīng)用對(duì)象,無論控制器和視圖,還是業(yè)務(wù)對(duì)象之類的都是java 組件.并且和 Spring 提供的其他基礎(chǔ)結(jié)構(gòu)緊密集成.
(2)不依賴于 ServletAPI(目標(biāo)雖是如此,但是在實(shí)現(xiàn)的時(shí)候確實(shí)是依賴于 Servlet 的)
(3)可以任意使用各種視圖技術(shù),而不僅僅局限于 JSP4.支持各種請(qǐng)求資源的映射策略5.它應(yīng)是易于擴(kuò)展的