1. 程式人生 > >web.xml中springmvc或者說spring的啟動方式

web.xml中springmvc或者說spring的啟動方式

都是 成了 根據 this creat pub pro erl value

//ContextLoaderListener類中的方法,servlet容器在啟動的時候會實例化ContextLoaderListener並調用本方法,裏面最關鍵的方法是createWebApplicationContext,邏輯是如果servletContext在配置文件中沒有用參數contextClass指定實例化哪一種ApplicationContext,
//那麽去ContextLoader類所在的包中的ContextLoader.properties文件中讀取org.springframework.web.context.support.XmlWebApplicationContext這個類並實例化,然後servletContext的setAttribute方法,
//把org.springframework.web.context.WebApplicationContext.ROOT做key,實例化的context做value存入。
//註意,在實例化之後,肯定要refresh一次context。這裏就會把配置文件全局的那個contextConfigLocation字段的值,作為setConfigLocation的值。所以其實配置的時候,dispatchservlet應該配springmvc.xml,而全局的配置文件中不應該包括springmvc.xml,否則這裏面的
bean會被實例化兩次,父工廠一個,子工廠一個,當然子工廠有了的話就不會去父工廠找,但是畢竟造成了資源浪費。
//ContextLoaderListener主要就做了這一件事,剩下的事情是DispatcherServlet做的
@Override
public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); }

DispatcherServlet從父類的父類HttpServletBean繼承(沒有重寫)了init()方法, 裏面主要調用initServletBean(),在父類FrameworkServlet中實現,主要是這兩句

this.webApplicationContext = initWebApplicationContext();

把剛才存入servletcontext中的rootContext取出,DispatchServlet,根據servlet規範,是在web.xml中配置,

如果在配置中然後根據構造參數註入單個servlet自己的webApplicationContext,然後把rootcontext設置為parent

如果沒有,看contextAttribute參數有沒有配置,如果有,實例化這一個。

如果沒有,那麽DispatchServlet中有一個默認的class名,取出來,自己新建,然後在自己的配置文件中contextConfigLocation這個字段的值setConfigLocation,以後新建的子spring工廠中所有的bean都是從contextConfigLocation這裏取。

這三種情況最後都會refresh一次工廠,這個是肯定的。

refresh???

web.xml中springmvc或者說spring的啟動方式