javascript
spring mvc原理_Spring常见问题整理
一.為什么要使用 spring?
1.Spring簡(jiǎn)介
spring 是一個(gè)開源的輕量級(jí) JavaBean 容器框架。使用 JavaBean 代替 EJB ,并提供了豐富的企業(yè)應(yīng)用功能,降低應(yīng)用開發(fā)的復(fù)雜性。
2.Spring優(yōu)點(diǎn)
1.輕量:非入侵性的、所依賴的東西少、資源占用少、部署簡(jiǎn)單,不同功能選擇不同的 jar 組合
2.容器:工廠模式實(shí)現(xiàn)對(duì) JavaBean 進(jìn)行管理,通過(guò)控制反轉(zhuǎn)(IOC)將應(yīng)用程序的配置和依賴性與應(yīng)用代碼分開
3.松耦合:通過(guò) xml 配置或注解即可完成 bean 的依賴注入
4.AOP:通過(guò) xml 配置 或注解即可加入面向切面編程的能力,完成切面功能,如:日志,事務(wù)...的統(tǒng)一處理
5.方便集成:通過(guò)配置和簡(jiǎn)單的對(duì)象注入即可集成其他框架,如 Mybatis、Hibernate、Shiro...
6.豐富的功能:JDBC 層抽象、事務(wù)管理、MVC、Java Mail、任務(wù)調(diào)度、JMX、JMS、JNDI、EJB、動(dòng)態(tài)語(yǔ)言、遠(yuǎn)程訪問(wèn)、Web Service...
二.解釋一下什么是 aop?
1.理解:在運(yùn)行時(shí),動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
2.優(yōu)勢(shì):使用AOP技術(shù),可以將一些系統(tǒng)性相關(guān)的編程工作,獨(dú)立提取出來(lái),獨(dú)立實(shí)現(xiàn),然后通過(guò)切面切入進(jìn)系統(tǒng)。從而避免了在業(yè)務(wù)邏輯的代碼中混入很多的系統(tǒng)相關(guān)的邏輯——比如權(quán)限管理,事物管理,日志記錄等等。
3.AOP相關(guān)的概念
(1) Aspect :切面,切入系統(tǒng)的一個(gè)切面。比如事務(wù)管理是一個(gè)切面,權(quán)限管理也是一個(gè)切面;
(2)Join point :連接點(diǎn),也就是可以進(jìn)行橫向切入的位置;
(3) Advice :通知,切面在某個(gè)連接點(diǎn)執(zhí)行的操作(分為: Before advice , After returning advice , After throwing advice , After (finally) advice , Around advice );
(4) Pointcut :切點(diǎn),符合切點(diǎn)表達(dá)式的連接點(diǎn),也就是真正被切入的地方;
4.AOP 的實(shí)現(xiàn)原理
(1)AOP分為靜態(tài)AOP和動(dòng)態(tài)AOP。
(2)靜態(tài)AOP是指AspectJ實(shí)現(xiàn)的AOP,他是將切面代碼直接編譯到Java類文件中。
(3)動(dòng)態(tài)AOP是指將切面代碼進(jìn)行動(dòng)態(tài)織入實(shí)現(xiàn)的AOP。
三.解釋一下什么是 ioc?
1.控制反轉(zhuǎn)(IoC)解決的主要問(wèn)題:為了解決對(duì)象之間的耦合度過(guò)高的問(wèn)題
2.什么是控制反轉(zhuǎn)(IoC):借助于“第三方”實(shí)現(xiàn)具有依賴關(guān)系的對(duì)象之間的解耦,IOC容器相當(dāng)于整個(gè)系統(tǒng)的“粘合劑”,它把系統(tǒng)中的所有對(duì)象粘合在一起發(fā)揮作用,如果沒(méi)有這個(gè)“粘合劑”,對(duì)象與對(duì)象之間會(huì)彼此失去聯(lián)系
舉例:
此時(shí):要想程序正常運(yùn)轉(zhuǎn),每個(gè)齒輪都不能出現(xiàn)問(wèn)題。此時(shí):各部件之間沒(méi)有耦合關(guān)系,A壞了,B、C、D照常運(yùn)轉(zhuǎn)。3.為什么叫控制反轉(zhuǎn)(IOC)
沒(méi)有引入IOC容器之前,如圖1所示,對(duì)象A依賴于對(duì)象B,那么對(duì)象A在初始化或者運(yùn)行到某一點(diǎn)的時(shí)候,自己必須主動(dòng)去創(chuàng)建對(duì)象B或者使用已經(jīng)創(chuàng)建的對(duì)象B。無(wú)論是創(chuàng)建還是使用對(duì)象B,控制權(quán)都在自己手上。
引入IOC容器之后,如圖2所示,由于IOC容器的加入,對(duì)象A與對(duì)象B之間失去了直接聯(lián)系,所以,當(dāng)對(duì)象A運(yùn)行到需要對(duì)象B的時(shí)候,IOC容器會(huì)主動(dòng)創(chuàng)建一個(gè)對(duì)象B注入到對(duì)象A需要的地方。
對(duì)比可以看出:對(duì)象A獲得依賴對(duì)象B的過(guò)程,由主動(dòng)行為變?yōu)榱吮粍?dòng)行為,控制權(quán)顛倒了,所以叫控制反轉(zhuǎn)
四.spring 有哪些主要模塊?
核心容器(Spring Core)
核心容器提供Spring框架的基本功能。
Spring以bean的方式組織和管理Java應(yīng)用中的各個(gè)組件及其關(guān)系。
Spring使用BeanFactory來(lái)產(chǎn)生和管理Bean,它是工廠模式的實(shí)現(xiàn)。
BeanFactory使用控制反轉(zhuǎn)(IoC)模式將應(yīng)用的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
應(yīng)用上下文(Spring Context)
Spring上下文是一個(gè)配置文件,向Spring框架提供上下文信息。
Spring上下文包括企業(yè)服務(wù),如JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。
Spring面向切面編程(Spring AOP)
通過(guò)配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何對(duì)象支持 AOP。
Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
JDBC和DAO模塊(Spring DAO)
JDBC、DAO的抽象層提供了有意義的異常層次結(jié)構(gòu)
可用該結(jié)構(gòu)來(lái)管理異常處理,和不同數(shù)據(jù)庫(kù)供應(yīng)商所拋出的錯(cuò)誤信息。
異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大的降低了需要編寫的代碼數(shù)量,比如打開和關(guān)閉鏈接。
對(duì)象實(shí)體映射(Spring ORM)
Spring框架插入了若干個(gè)ORM框架,從而提供了ORM對(duì)象的關(guān)系工具
其中包括了Hibernate、JDO和 IBatis SQL Map等,所有這些都遵從Spring的通用事物和DAO異常層次結(jié)構(gòu)。
Web模塊(Spring Web)
Web上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于web的應(yīng)用程序提供了上下文。所以Spring框架支持與Struts集成,web模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>
MVC模塊(Spring Web MVC)
MVC框架是一個(gè)全功能的構(gòu)建Web應(yīng)用程序的MVC實(shí)現(xiàn)。通過(guò)策略接口,MVC框架變成為高度可配置的。MVC容納了大量視圖技術(shù),其中包括JSP、POI等,模型來(lái)有JavaBean來(lái)構(gòu)成,存放于m當(dāng)中,而視圖是一個(gè)街口,負(fù)責(zé)實(shí)現(xiàn)模型,控制器表示邏輯代碼,由c的事情。Spring框架的功能可以用在任何J2EE服務(wù)器當(dāng)中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring的核心要點(diǎn)就是支持不綁定到特定J2EE服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)的訪問(wèn)的對(duì)象,毫無(wú)疑問(wèn)這樣的對(duì)象可以在不同的J2EE環(huán)境,獨(dú)立應(yīng)用程序和測(cè)試環(huán)境之間重用。
五.spring 常用的注入方式有哪些?
1.構(gòu)造方法注入:構(gòu)造方法
2.setter注入:set方法
3.基于注解的注入:@Autowired
六.spring 中的 bean 是線程安全的嗎?
1.結(jié)論: 不是線程安全的
2.原因:容器本身并沒(méi)有提供Bean的線程安全策略,因此可以說(shuō)Spring容器中的Bean本身不具備線程安全的特性。spring bean默認(rèn)來(lái)說(shuō),singleton,都是線程不安全的。一般來(lái)說(shuō)他們都是多個(gè)組件互相調(diào)用,最終去訪問(wèn)數(shù)據(jù)庫(kù)的。
七.spring 支持幾種 bean 的作用域?
1.singleton :bean在每個(gè)Spring ioc 容器中只有一個(gè)實(shí)例。
2.prototype:一個(gè)bean的定義可以有多個(gè)實(shí)例。
3.request:每次http請(qǐng)求都會(huì)創(chuàng)建一個(gè)bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。
4.session:在一個(gè)HTTP Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
5.global-session:在一個(gè)全局的HTTP Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
缺省的(系統(tǒng)默認(rèn)狀態(tài))Spring bean 的作用域是Singleton.
八.spring 自動(dòng)裝配 bean 有哪些方式?
1.如何開啟自動(dòng)裝配
在Spring框架中,開啟自動(dòng)裝配,只需要在xml配置文件<bean>中定義“autowire”屬性。
<bean id="A" class="com.xxx.xxx.A" autowire="" />
2.自動(dòng)裝配的五種方式
(1)no – 缺省情況下,自動(dòng)配置是通過(guò)“ref”屬性手動(dòng)設(shè)定 。
例如:將person裝配到cutomer中
<bean id="cutomer" class="com.xxx.xxx.Cutomer"><property name="person" ref="cutomer"/></bean><bean id="person" class="com.xxx.xxx.Person"/>(2)byName - 根據(jù)bean的屬性名稱進(jìn)行自動(dòng)裝配(bean通過(guò)setter方法進(jìn)行自動(dòng)裝配)
(3)byType - 根據(jù)bean的類型進(jìn)行自動(dòng)裝配(bean通過(guò)setter方法進(jìn)行自動(dòng)裝配)
(4)constructor - 類似byType,不過(guò)是應(yīng)用于構(gòu)造器的參數(shù)。如果一個(gè)bean與構(gòu)造器參數(shù)的類型形同,則進(jìn)行自動(dòng)裝配,否則導(dǎo)致異常((bean通過(guò)構(gòu)造器方法進(jìn)行自動(dòng)裝配))
(5)autodetect - 如果有默認(rèn)的構(gòu)造器,則通過(guò)constructor方式進(jìn)行自動(dòng)裝配,否則使用byType方式進(jìn)行自動(dòng)裝配。
九.spring 事務(wù)實(shí)現(xiàn)方式有哪些?
1.aspectJ AOP實(shí)現(xiàn)事務(wù):
2.事務(wù)代理工廠Bean實(shí)現(xiàn)事務(wù):
3.注解方式實(shí)現(xiàn)事務(wù):
十.說(shuō)一下 spring 的事務(wù)隔離?
請(qǐng)移步:https://zhuanlan.zhihu.com/p/210831218
十一.說(shuō)一下 spring mvc 運(yùn)行流程?
1、 用戶發(fā)送請(qǐng)求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping處理器映射器。
3、 處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找),生成處理器對(duì)象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
4、 DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
5、 HandlerAdapter經(jīng)過(guò)適配調(diào)用具體的處理器(Controller,也叫后端控制器)。
6、 Controller執(zhí)行完成返回ModelAndView。
7、 HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet。
8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
9、 ViewReslover解析后返回具體View。
10、DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
11、 DispatcherServlet響應(yīng)用戶。
十二.spring mvc 有哪些組件?
1.SpringMVC中的Servlet的三個(gè)層次
(1)HttpServletBean:直接繼承自java的HttpServlet,其作用是將Servlet中配置的參數(shù)設(shè)置到相應(yīng)的屬性;
(2)FrameworkServlet:初始化了WebApplicationContext;
(3)DispatcherServlet初始化了自身的9個(gè)組件;
2.什么是Handler
Handler也就是處理器。它直接應(yīng)對(duì)著MVC中的C也就是Controller層,它的具體表現(xiàn)形式有很多,可以是類,也可以是方法。在Controller層中@RequestMapping標(biāo)注的所有方法都可以看成是一個(gè)Handler,只要可以實(shí)際處理請(qǐng)求就可以是Handler。
3.Spring MVC的9大組件
(1)HandlerMapping(映射)
是用來(lái)查找Handler的。在SpringMVC中會(huì)有很多請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)Handler處理,具體接收到一個(gè)請(qǐng)求之后使用哪個(gè)Handler進(jìn)行處理呢?這就是HandlerMapping需要做的事。
(2) HandlerAdapter(適配器)
SpringMVC中的Handler可以是任意的形式,只要能處理請(qǐng)求就ok,但是Servlet需要的處理方法的結(jié)構(gòu)卻是固定的,都是以request和response為參數(shù)的方法。HandlerAdapter的作用就是將任意形式的Handler,通過(guò)使用適配器,可以“轉(zhuǎn)換”成固定形式,然后交給Servlet來(lái)處理。每種Handler都要有對(duì)應(yīng)的HandlerAdapter才能處理請(qǐng)求。
(3)HandlerExceptionResolver(異常處理)
專門用來(lái)對(duì)異常情況進(jìn)行處理,具體來(lái)說(shuō),此組件的作用是根據(jù)異常設(shè)置ModelAndView,之后再交給render方法進(jìn)行渲染。HandlerExceptionResolver只能處理頁(yè)面渲染之前的異常,頁(yè)面渲染過(guò)程中的異常,它是不能處理的,這時(shí)可以讓容器跳轉(zhuǎn)到指定的錯(cuò)誤頁(yè)面來(lái)處理異常。
(4)ViewResolver(視圖解析器)
ViewResolver用來(lái)將String類型的視圖名和Locale解析為View類型的視圖。View是用來(lái)渲染頁(yè)面的,也就是將程序返回的參數(shù)填入模板里,生成html(也可能是其它類型)文件。這里就有兩個(gè)關(guān)鍵問(wèn)題:使用哪個(gè)模板?用什么技術(shù)(規(guī)則)填入?yún)?shù)?這其實(shí)是ViewResolver主要要做的工作,ViewResolver需要找到渲染所用的模板和所用的技術(shù)(也就是視圖的類型)進(jìn)行渲染,具體的渲染過(guò)程則交由不同的視圖自己完成。
(5)RequestToViewNameTranslator(從request中獲取ViewName)
ViewName是根據(jù)ViewName查找View,但有的Handler處理完后并沒(méi)有設(shè)置View也沒(méi)有設(shè)置ViewName,這時(shí)就需要RequestToViewNameTranslator從request中找到默認(rèn)的View了。如何從request中獲取ViewName就是RequestToViewNameTranslator要做的事情了。RequestToViewNameTranslator在Spring MVC容器里只可以配置一個(gè),所以所有request到ViewName的轉(zhuǎn)換規(guī)則都要在一個(gè)Translator里面全部實(shí)現(xiàn)。
(6)LocaleResolver(解析Locale(地理、政治和文化地區(qū)))
解析視圖需要兩個(gè)參數(shù):一是視圖名,另一個(gè)是Locale。視圖名是處理器返回的,Locale是從哪里來(lái)的?這就是LocaleResolver要做的事情。LocaleResolver用于從request解析出Locale,Locale就是zh-cn之類,表示一個(gè)區(qū)域,有了這個(gè)就可以對(duì)不同區(qū)域的用戶顯示不同的結(jié)果。SpringMVC主要有兩個(gè)地方用到了Locale:一是ViewResolver視圖解析的時(shí)候;二是用到國(guó)際化資源或者主題的時(shí)候。
(7)ThemeResolver(主題解析)
用于解析主題。SpringMVC中一個(gè)主題對(duì)應(yīng)一個(gè)properties文件,里面存放著跟當(dāng)前主題相關(guān)的所有資源、如圖片、css樣式等。SpringMVC的主題也支持國(guó)際化,同一個(gè)主題不同區(qū)域也可以顯示不同的風(fēng)格。SpringMVC中跟主題相關(guān)的類有 ThemeResolver、ThemeSource和Theme。主題是通過(guò)一系列資源來(lái)具體體現(xiàn)的,要得到一個(gè)主題的資源,首先要得到資源的名稱,這是ThemeResolver的工作。然后通過(guò)主題名稱找到對(duì)應(yīng)的主題(可以理解為一個(gè)配置)文件,這是ThemeSource的工作。最后從主題中獲取資源就可以了。
(8)MultipartResolver(上傳文件解析)
用于處理上傳文件請(qǐng)求。處理方法是將普通的request包裝成MultipartHttpServletRequest,后者可以直接調(diào)用getFile方法獲取File,如果上傳多個(gè)文件,還可以調(diào)用getFileMap得到FileName->File結(jié)構(gòu)的Map。此組件中一共有三個(gè)方法,作用分別是判斷是不是上傳請(qǐng)求,將request包裝成MultipartHttpServletRequest、處理完后清理上傳過(guò)程中產(chǎn)生的臨時(shí)資源。
(9)FlashMapManager(管理FlashMap)
用來(lái)管理FlashMap的,FlashMap主要用在redirect中傳遞參數(shù)。
十三.@RequestMapping 的作用是什么?
@RequestMapping是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,可用于類或者方法上。用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。
@RequestMapping注解有六個(gè)屬性,下面進(jìn)行詳細(xì)的說(shuō)明。
1.value:指定請(qǐng)求的實(shí)際地址,指定的地址可以是URI Template模式。
2.method:指定請(qǐng)求的method類型,GET、POST、PUT、DELETE等。
3.consumes:指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type),例如application/json,text/html。
4.produces:指定返回的內(nèi)容類型,僅當(dāng)request請(qǐng)求頭中的(Accept)類型中包含該指定類型才返回。
5.params:指定request中必須包含某些參數(shù)值才讓該方法處理。
6.headers:指定request中必須包含某些指定的header值,才能讓該方法處理請(qǐng)求。
十四.@Autowired 的作用是什么?
@Autowired 它可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作,通過(guò)@Autowired 的使用來(lái)消除 set/get 方法。
十五、你怎么理解spring的di
1.di依賴注入:描述對(duì)象之間的依賴關(guān)系 在spring工廠中設(shè)值注入或者構(gòu)造注入維護(hù)關(guān)系
十六、spring中@Autowired和@Resource的區(qū)別是什么
1. @Autowired與@Resource都可以用來(lái)裝配bean. 都可以寫在字段上,或?qū)懺趕etter方法上。
2.@Autowired默認(rèn)按byType注入,byName需要與@Qualifier("對(duì)象名")連用。
@Resource同時(shí)支持byType和byName注入,默認(rèn)按byName注入,如果默認(rèn)情況下找不到就按類型找(name屬性解析為bean的名字,而type屬性則解析為bean的類型)
3.@Autowired是spring提供的注釋,@Resource是JAVA2EE提供的。
總結(jié)
以上是生活随笔為你收集整理的spring mvc原理_Spring常见问题整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python编译文件瘦身_python优
- 下一篇: python图形用户界面pyside_P