spring的核心就是容器,何為容器,簡單的說就是管理Java對象的一個大罐子,任何java對象都可以讓spring去管理,省的我們操心,我們在用的時候只需要從spring容器中取出來即可,很方便,這也是為什么spring可以成為web開發的主流框架。下面我談談spring的父子容器
?什么叫父子容器?簡單點說spring的父子容器有點類似于java的繼承,spring的規則是 子容器的bean可以訪問到父容器的bean但是父容器的bean是沒有權限訪問子容器的bean 這是spring不成文的規定下面我以web開發為例講解上下文:
父上下文:
使用listener監聽器來加載配置文件,如下:
Spring 會創建一個WebApplicationContext上下文,稱為父上下文(父容器),保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。
可以使用Spring提供的工具類取出上下文對象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
子上下文:
使用Spring MVC 來處理攔截相關的請求時,會配置DispatchServlet
每個DispatchServlet會有一個自己的上下文,稱為子上下文,它也保存在 ServletContext中,key 是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名稱。當一 個Request對象產生時,會把這個子上下文對象(WebApplicationContext)保存在Request對象中,key是 DispatcherServlet.class.getName() + ".CONTEXT"。
可以使用工具類取出上下文對象:RequestContextUtils.getWebApplicationContext(request);
父上下文(父容器)和子上下文(子容器)的訪問權限:
子上下文可以訪問父上下文中的bean,但是父上下文不可以訪問子上下文中的bean