spring 做用域理解

今天抽空看了一下Spring做用域,以前對這些細節點沒有太在乎。可是做爲一個Java愛好者仍是須要認真學習的。言歸正傳html

Spring bean目前有singleton,prototype、request、session、global session5種做用域,默認使用的是singleton, 即 scope=「singleton「。web

一、singleton設計模式

當設置scope=「singleton「,Spring IOC在整個上下文中始終只有一個實例對象,全部請求都會返回相同的實例對象,即該實例對象共享,另外值得注意得失該singleton與安全

設計模式中的單利模式是有區別的,設計模式中的單例模式是至整個jvm中,Classloader始終加載的是一個類,在Spring IOC容器中只有一個實例對象,這個單例會被存儲在session

singleton cache中,它在整個容器中是徹底共享的包括代碼和空間數據。jvm

二、prototype學習

當設置scope=「prototype「時,每一次請求都會從容器中產生一個新的bean,至關於new一個新的對象,對於prototype下的bean的生命週期是不受Spring管理的,徹底交給代碼人員去管理,也就是說bean資源的清除,消費空間等都須要編碼人員把握。編碼

三、requestspa

當設置scope=「request「時,該模式只對request請求新建一個bean,並且只對http request請求有效,那麼https是不支持的prototype

四、session

當設置scope=「session「時,該做用域只對http請求新建一個bean,並且只對http session 有效

五、global session

當設置scope=「global session「時 該做用域確切的講只對標準的http session有效,可是隻有在portlet的web應用中才有意義,由於portlet中有全局session的概念,也就說明了bean的生命週期被限定在了portlet的session中

總結:只關注前兩singleton 與prototype 便可,目前經常使用的是singleton;考慮線程安全問題,咱們經常使用service,dao之因此是singleton是由於他們都是無狀態對象,不帶有任何的數據,若是某一個service設置成員變量了那麼它就須要聲明scope=「prototype「,不然數據共享確定會產生線程安全問題,可是一旦使用了scope=「prototype「做用域它的資源消耗也是很大的須要慎重考慮使用場景,另外若是存在單例做爲屬性注入到多例中去的時候能夠考慮lookup-method ,專門解決這種問題的。

相關文章
相關標籤/搜索