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