javascript
Spring 容器(Spring 的上下文)
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
最近在做項(xiàng)目時(shí)牽扯到有關(guān)父子上下文的概念。
何為父子上下文呢?
父上下文:
使用listener監(jiān)聽器來(lái)加載配置文件,如下:
<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);
子上下文:
使用Spring MVC 來(lái)處理攔截相關(guān)的請(qǐng)求時(shí),會(huì)配置DispatchServlet:
<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup> </servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern> </servlet-mapping>每個(gè)DispatchServlet會(huì)有一個(gè)自己的上下文,稱為子上下文,它也保存在 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);
父上下文(父容器)和子上下文(子容器)的訪問(wèn)權(quán)限:
子上下文可以訪問(wèn)父上下文中的bean,但是父上下文不可以訪問(wèn)子上下文中的bean。
父上下文使用與否
方案一,傳統(tǒng)型:
父上下文容器中保存數(shù)據(jù)源、服務(wù)層、DAO層、事務(wù)的Bean。
子上下文容器中保存Mvc相關(guān)的Action的Bean.
事務(wù)控制在服務(wù)層。
由于父上下文容器不能訪問(wèn)子上下文容器中內(nèi)容,事務(wù)的Bean在父上下文容器中,無(wú)法訪問(wèn)子上下文容器中內(nèi)容,就無(wú)法對(duì)子上下文容器中Action進(jìn)行AOP(事務(wù))。
當(dāng)然,做為“傳統(tǒng)型”方案,也沒(méi)有必要這要做。
?
方案二,激進(jìn)型:
Java世界的“面向接口編程”的思想是正確的,但在增刪改查為主業(yè)務(wù)的系統(tǒng)里,Dao層接口,Dao層實(shí)現(xiàn)類,Service層接口,Service層實(shí)現(xiàn)類,Action父類,Action。再加上眾多的O(vo\po\bo)和jsp頁(yè)面。寫一個(gè)小功能 7、8個(gè)類就寫出來(lái)了。 開發(fā)者說(shuō)我就是想接點(diǎn)私活兒,和PHP,ASP搶搶飯碗,但我又是Java程序員。最好的結(jié)果是大項(xiàng)目能做好,小項(xiàng)目能做快。所以“激進(jìn)型”方案就出現(xiàn)了-----沒(méi)有接口、沒(méi)有Service層、還可以沒(méi)有眾多的O(vo\po\bo)。那沒(méi)有Service層事務(wù)控制在哪一層?只好上升的Action層。
本文不想說(shuō)這是不是正確的思想,我想說(shuō)的是Spring不會(huì)限制你這樣做。
由于有了父子上下文,你將無(wú)法實(shí)現(xiàn)這一目標(biāo)。解決方案是只使用子上下文容器,不要父上下文容器?。所以數(shù)據(jù)源、服務(wù)層、DAO層、事務(wù)的Bean、Action的Bean都放在子上下文容器中。就可以實(shí)現(xiàn)了,事務(wù)(注解事務(wù))就正常工作了。這樣才夠激進(jìn)。
總結(jié):不使用listener監(jiān)聽器來(lái)加載spring的配置文件,只使用DispatcherServlet來(lái)加載spring的配置,不要父子上下文,只使用一個(gè)DispatcherServlet,事情就簡(jiǎn)單了,什么麻煩事兒也沒(méi)有了。
?
?
?
Java--大項(xiàng)目能做好--按傳統(tǒng)方式做,規(guī)規(guī)矩矩的做,好擴(kuò)展,好維護(hù)。
Java--小項(xiàng)目能做快--按激進(jìn)方式做,一周時(shí)間就可以出一個(gè)版本,先上線接受市場(chǎng)(用戶)的反饋,再改進(jìn),再反饋,時(shí)間就是生命(成本)。
轉(zhuǎn)載于:https://my.oschina.net/jast90/blog/282773
總結(jié)
以上是生活随笔為你收集整理的Spring 容器(Spring 的上下文)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: rpmbuild FILE
- 下一篇: 超短的判断IE javascript代码