什么是單例多例
在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)記在類上即可。
