中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springbean作用域屬性singleton和prototype的區別是什么

發布時間:2021-10-15 17:49:48 來源:億速云 閱讀:169 作者:柒染 欄目:編程語言

springbean作用域屬性singleton和prototype的區別是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1.singleton

當一個bean的作用域設置為singleton, 那么Spring IOC容器中只會存在一個共享的bean實例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。

換言之,當把一個bean定義設置為singleton作用域時,Spring IOC容器只會創建該bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,并且所有針對該bean的后續請求和引用都將返回被緩存的對象實例,這里要注意的是singleton作用域和GOF設計模式中的單例是完全不同的,單例設計模式表示一個ClassLoader中只有一個class存在,而這里的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識為singleton時候,spring的IOC容器中只會存在一個該bean。

applicationContextER.xml:

<!--Spring bean作用域-->  <bean id="get_date" class="java.util.Date" scope="singleton"/>

測試代碼:

public class GetDate {  public static void main(String[] args){    //獲取應用程序上下文接口    ApplicationContext apl = new ClassPathXmlApplicationContext("applicationContextER.xml");    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    try {      //反復調用getBean來查看時間      Date date = (Date) apl.getBean("get_date");      //休息3秒      Thread.sleep(1000);      System.out.println("--------------:" + simpleDateFormat.format(date));      Date date1 = (Date) apl.getBean("get_date");      Thread.sleep(1000);      System.out.println("--------------:" + simpleDateFormat.format(date1));      Date date2 = (Date) apl.getBean("get_date");      Thread.sleep(1000);      System.out.println("--------------:" + simpleDateFormat.format(date2));      System.out.println("date is date1 : " + (date == date1));      System.out.println("date1 is date2 : " + (date1 == date2));    } catch (Exception e) {    }  }}

測試結果:

23:05:04.298 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'get_date'23:05:04.298 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'get_date'23:05:04.308 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'get_date' to allow for resolving potential circular references23:05:04.309 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'get_date'23:05:04.310 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@3108bc]23:05:04.310 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'23:05:04.311 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source23:05:04.316 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'get_date'--------------:2019-12-21 23:05:0423:05:05.320 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'get_date'--------------:2019-12-21 23:05:0423:05:06.324 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'get_date'--------------:2019-12-21 23:05:04date is date1 : truedate1 is date2 : true

從上面的結果可以看出,創建好對象之后,存入了緩存中。后面每次都是獲取的對象都是從緩存中獲取的,而不是新創建的。所以每次獲取的對象都是一樣的。

2.prototype

prototype作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)都會產生一個新的bean實例,相當與一個new的操作,對于prototype作用域的bean,有一點非常重要,那就是Spring不能對一個prototype bean的整個生命周期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例后,將它交給客戶端,隨后就對該prototype實例不聞不問了。

不管何種作用域,容器都會調用所有對象的初始化生命周期回調方法,而對prototype而言,任何配置好的析構生命周期回調方法都將不會被調用。清除prototype作用域的對象并釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton作用域bean占用資源的一種可行方式是,通過使用bean的后置處理器,該處理器持有要被清除的bean的引用。

applicationContextER.xml:

<!--Spring bean作用域-->  <bean id="get_date" class="java.util.Date" scope="prototype"/>

測試結果:

23:01:51.314 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'get_date'23:01:51.324 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'get_date'--------------:2019-12-21 23:01:5123:01:52.329 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'get_date'23:01:52.329 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'get_date'--------------:2019-12-21 23:01:5223:01:53.330 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'get_date'23:01:53.331 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'get_date'--------------:2019-12-21 23:01:53date is date1 : falsedate1 is date2 : false

從上面的結果可以看出,每次都是創建一個新對象,所以每次的對象都不一樣。

總結:從1和2可以看出,當你需要全局的唯一標示的時候可以用singleton,而且singleton只創建一個對象,系統消耗資源小.但是用singleton可能會有線程安全化的問題,這個時候就需要用到prototype 。考慮并發的問題,建議都用prototype。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孟州市| 禹城市| 泰州市| 长武县| 台北市| 弥勒县| 永州市| 南雄市| 六安市| 红安县| 合川市| 乐安县| 四会市| 孟连| 保康县| 禹州市| 财经| 光山县| 长寿区| 商洛市| 昆山市| 辉县市| 永德县| 宾川县| 正宁县| 南皮县| 平阳县| 东辽县| 正定县| 北京市| 横山县| 保亭| 南丹县| 临桂县| 天长市| 扶余县| 宁化县| 洛扎县| 海安县| 拉萨市| 关岭|