spring中bean實例化時機以及整個運轉方式


接上一篇文章,一般在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為中軸線進行的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM