Spring對(duì)象類型——單例和多例

什么是單例多例

在Spring中,bean可以被定義為兩種模式:prototype(多例)和singleton(單例)。所謂單例,就是所有的請(qǐng)求都由一個(gè)對(duì)象來進(jìn)行處理,比如我們常用的service和dao層的對(duì)象通常都是單例的,而多例則指每個(gè)請(qǐng)求用一個(gè)新的對(duì)象來處理。

singleton(單例):只有一個(gè)共享的實(shí)例存在,所有對(duì)這個(gè)bean的請(qǐng)求都會(huì)返回這個(gè)唯一的實(shí)例。不管new多少次,只生成一個(gè)對(duì)象。
prototype(多例):對(duì)這個(gè)bean的每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的bean實(shí)例,類似于new。

為什么使用單例和多例

之所以用單例,是因?yàn)闆]必要每個(gè)請(qǐng)求都新建一個(gè)對(duì)象,這樣子既浪費(fèi)CPU又浪費(fèi)內(nèi)存;之所以用多例,是為了防止并發(fā)問題;即一個(gè)請(qǐng)求改變了對(duì)象的狀態(tài),此時(shí)對(duì)象又處理另一個(gè)請(qǐng)求,而之前請(qǐng)求對(duì)對(duì)象狀態(tài)的改變導(dǎo)致了對(duì)象對(duì)另一個(gè)請(qǐng)求做了錯(cuò)誤的處理。
??用單例和多例的標(biāo)準(zhǔn)只有一個(gè):當(dāng)對(duì)象含有可改變的狀態(tài)時(shí)(更精確的說就是在實(shí)際應(yīng)用中該狀態(tài)會(huì)改變),則多例,否則單例。就如dao和service這兩層的數(shù)據(jù)一般不會(huì)有相應(yīng)的屬性修改,所以可以考慮用單例,而Controller層會(huì)存儲(chǔ)很多需要操作的vo類(value object值對(duì)象),此時(shí)這個(gè)對(duì)象的狀態(tài)就會(huì)被改變,就要使用多例。

如何在spring中配置單例和多例

1. 使用xml配置單例和多例
在<bean>標(biāo)簽中的scope設(shè)置單例/多例即可。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
  <!--設(shè)置Hi類為單例-->
  <bean id="hi" class="com.test.Hi" init-method="init" scope="singleton">
</beans>

在測(cè)試類中,修改代碼為:

ApplicationContext context = 
   new FileSystemXmlApplicationContext("applicationContext.xml");
Hi hi1 = (Hi) context.getBean("hi");
Hi hi2 = (Hi) context.getBean("hi");
System.out.println(hi1);
System.out.println(hi2);

結(jié)果為:


2.使用annotation配置單例和多例
使用@Scope()標(biāo)記在類上即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容