接上一篇文章,一般在servlet獲取到請求之后 在service方法中就可以完成所有的請求處理以及返回,但是我們會采用更高級的MVC框架來做。也就是說所有的MVC框架入口就是serlvet中的service方法。
springmvc中的bean實例化:
spring中bean默認是sinleton的,延遲加載為false 。即
如果想要一個類延遲實例化,那么將其的lazy-init=”true”或改變其 scope(類的管理方式)。
spring在服務器啟動時就將所有的 singleton 的 bean提前實例化,這個應該是 在web.xml中配置的 ContextLoaderListener做的。
在ssh框架下,新建了3個類,UserDaoImpl,UserServiceImpl,UserAction,他們的空參構造方法中都寫了一句話表示本類被初始化了。
測試如下,啟動服務器,三句話都被打印出來了,說明這三個bean在服務器啟動的時候都被初始化了。
如果使用單例singleton來管理action的話,如下圖,兩次調用的是同一個UserAction實例的save()方法
但是因為struts2的action是不是單例的,線程安全的,效率比較低。
修改UserAction的scop為prototype原型,啟動服務器,發現UserAction是沒有被初始化的。
再次兩次訪問save方法。發現使用了prototype之后,生成兩個UserAction實例
繼續修改代碼,將UserService的lazy-init設置為ture。如下圖,可以發現,現在只有UserDaoImpl被初始化了
修改了一下UserAction,在其中調用了UserService的save方法。此時訪問save()方法,可以發現UserServiceImpl被初始化了。
spring文檔:需要說明的是,如果一個bean被設置為延遲初始化,而另一個非延遲初始化的singleton bean依賴於它,那么當ApplicationContext提前實例化singleton bean時,它必須也確保所有上述singleton 依賴bean也被預先初始化,當然也包括設置為延遲實例化的bean。因此,如果Ioc容器在啟動的時候創建了那些設置為延遲實例化的bean的實例,你也不要覺得奇怪,因為那些延遲初始化的bean可能在配置的某個地方被注入到了一個非延遲初始化singleton bean里面。
總結
spring管理的bean在默認情況下是會在服務器啟動的時候初始化的。
bean設置了scope為prototype(原型)之后,會每次使用時生產一個
bean設置了lazy-init=”true”后,啟動服務器不會馬上實例化,而是在用到的時候被實例化。
SpringMVC核心處理流程:
1、DispatcherServlet前端控制器接收發過來的請求,交給HandlerMapping處理器映射器
2、HandlerMapping處理器映射器,根據請求路徑找到相應的HandlerAdapter處理器適配器(處理器適配器就是那些攔截器或Controller)
3、HandlerAdapter處理器適配器,處理一些功能請求,返回一個ModelAndView對象(包括模型數據、邏輯視圖名)
4、ViewResolver視圖解析器,先根據ModelAndView中設置的View解析具體視圖
5、然后再將Model模型中的數據渲染到View上
這些過程都是以DispatcherServlet為中軸線進行的。