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