Spring MVC之WebApplicationContext_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
如果你使用了listener監(jiān)聽器來加載配置,一般在Struts+Spring+Hibernate的項(xiàng)目中都是使用listener監(jiān)聽器的。如下
Java代碼
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Spring會(huì)創(chuàng)建一個(gè)WebApplicationContext上下文,稱為父上下文(父容器) ,保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。
可以使用Spring提供的工具類取出上下文對(duì)象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
DispatcherServlet是一個(gè)Servlet,可以同時(shí)配置多個(gè),每個(gè) DispatcherServlet有一個(gè)自己的上下文對(duì)象(WebApplicationContext),稱為子上下文(子容器),子上下文可以訪問父上下文中的內(nèi)容,但父上下文不能訪問子上下文中的內(nèi)容。 它也保存在 ServletContext中,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名稱。
當(dāng)一個(gè)Request對(duì)象產(chǎn)生時(shí),會(huì)把這個(gè)子上下文對(duì)象(WebApplicationContext)保存在Request對(duì)象中,key是DispatcherServlet.class.getName() + ".CONTEXT"。
可以使用工具類取出上下文對(duì)象:RequestContextUtils.getWebApplicationContext(request);
說明 :Spring 并沒有限制我們,必須使用父子上下文。我們可以自己決定如何使用。
方案一,傳統(tǒng)型:
父上下文容器中保存數(shù)據(jù)源、服務(wù)層、DAO層、事務(wù)的Bean。
子上下文容器中保存Mvc相關(guān)的Action的Bean.
事務(wù)控制在服務(wù)層。
由于父上下文容器不能訪問子上下文容器中內(nèi)容,事務(wù)的Bean在父上下文容器中,無法訪問子上下文容器中內(nèi)容,就無法對(duì)子上下文容器中Action進(jìn)行AOP(事務(wù))。
當(dāng)然,做為“傳統(tǒng)型”方案,也沒有必要這要做。
方案二,激進(jìn)型:
Java世界的“面向接口編程”的思想是正確的,但在增刪改查為主業(yè)務(wù)的系統(tǒng)里,Dao層接口,Dao層實(shí)現(xiàn)類,Service層接口,Service層實(shí)現(xiàn)類,Action父類,Action。再加上眾多的O(vo\po\bo)和jsp頁面。寫一個(gè)小功能 7、8個(gè)類就寫出來了。 開發(fā)者說我就是想接點(diǎn)私活兒,和PHP,ASP搶搶飯碗,但我又是Java程序員。最好的結(jié)果是大項(xiàng)目能做好,小項(xiàng)目能做快。所以“激進(jìn)型”方案就出現(xiàn)了-----沒有接口、沒有Service層、還可以沒有眾多的O(vo\po\bo)。那沒有Service層事務(wù)控制在哪一層?只好上升的Action層。
本文不想說這是不是正確的思想,我想說的是Spring不會(huì)限制你這樣做。
由于有了父子上下文,你將無法實(shí)現(xiàn)這一目標(biāo)。解決方案是只使用子上下文容器,不要父上下文容器 。所以數(shù)據(jù)源、服務(wù)層、DAO層、事務(wù)的Bean、Action的Bean都放在子上下文容器中。就可以實(shí)現(xiàn)了,事務(wù)(注解事務(wù))就正常工作了。這樣才夠激進(jìn)。
總結(jié):不使用listener監(jiān)聽器來加載spring的配置文件,只使用DispatcherServlet來加載spring的配置,不要父子上下文,只使用一個(gè)DispatcherServlet,事情就簡單了,什么麻煩事兒也沒有了。
Java--大項(xiàng)目能做好--按傳統(tǒng)方式做,規(guī)規(guī)矩矩的做,好擴(kuò)展,好維護(hù)。
Java--小項(xiàng)目能做快--按激進(jìn)方式做,一周時(shí)間就可以出一個(gè)版本,先上線接受市場(chǎng)(用戶)的反饋,再改進(jìn),再反饋,時(shí)間就是生命(成本)。
- Spring中BeanFactory和ApplicationContext的作用和區(qū)別(推薦)
- Spring IoC學(xué)習(xí)之ApplicationContext中refresh過程詳解
- SpringBoot獲取ApplicationContext的3種方式
- Spring主配置文件(applicationContext.xml) 導(dǎo)入約束詳解
- Spring通過ApplicationContext主動(dòng)獲取bean的方法講解
- spring中通過ApplicationContext getBean獲取注入對(duì)象的方法實(shí)例
- 詳解Spring Boot的GenericApplicationContext使用教程
- Spring獲取ApplicationContext對(duì)象工具類的實(shí)現(xiàn)方法
- JSP Spring ApplicationContext的國際化支持
- 詳解spring applicationContext.xml 配置文件
- 詳解Spring ApplicationContext加載過程
相關(guān)文章
設(shè)置JavaScript自動(dòng)提示-Eclipse/MyEclipse
自動(dòng)提示需要2個(gè)組件,分別是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以參考下2016-05-05
利用Spring Cloud Config結(jié)合Bus實(shí)現(xiàn)分布式配置中心的步驟
這篇文章主要介紹了利用Spring Cloud Config結(jié)合Bus實(shí)現(xiàn)分布式配置中心的相關(guān)資料,文中通過示例代碼將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來一起看看吧2018-05-05
Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn)
這篇文章主要介紹了Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例
在實(shí)際項(xiàng)目中,某些場(chǎng)景下可能需要使用到分布式鎖功能,那么實(shí)現(xiàn)分布式鎖有多種方式,常見的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下2023-06-06
詳解Spring事件發(fā)布與監(jiān)聽機(jī)制
Spring提供了ApplicationContext事件機(jī)制,可以發(fā)布和監(jiān)聽事件,這個(gè)特性非常有用。Spring內(nèi)置了一些事件和監(jiān)聽器,例如在Spring容器啟動(dòng)前,Spring容器啟動(dòng)后,應(yīng)用啟動(dòng)失敗后等事件發(fā)生后,監(jiān)聽在這些事件上的監(jiān)聽器會(huì)做出相應(yīng)的響應(yīng)處理2021-06-06
SpringMvc實(shí)現(xiàn)簡易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了SpringMvc實(shí)現(xiàn)簡易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

