什么是單例多例
在Spring中,bean可以被定義為兩種模式:prototype(多例)和singleton(單例)。所謂單例,就是所有的請求都由一個對象來進行處理,比如我們常用的service和dao層的對象通常都是單例的,而多例則指每個請求用一個新的對象來處理。
singleton(單例):只有一個共享的實例存在,所有對這個bean的請求都會返回這個唯一的實例。不管new多少次,只生成一個對象。
prototype(多例):對這個bean的每次請求都會創建一個新的bean實例,類似于new。
為什么使用單例和多例
之所以用單例,是因為沒必要每個請求都新建一個對象,這樣子既浪費CPU又浪費內存;之所以用多例,是為了防止并發問題;即一個請求改變了對象的狀態,此時對象又處理另一個請求,而之前請求對對象狀態的改變導致了對象對另一個請求做了錯誤的處理。
??用單例和多例的標準只有一個:當對象含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例。就如dao和service這兩層的數據一般不會有相應的屬性修改,所以可以考慮用單例,而Controller層會存儲很多需要操作的vo類(value object值對象),此時這個對象的狀態就會被改變,就要使用多例。
如何在spring中配置單例和多例
1. 使用xml配置單例和多例
在<bean>標簽中的scope設置單例/多例即可。
<?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">
<!--設置Hi類為單例-->
<bean id="hi" class="com.test.Hi" init-method="init" scope="singleton">
</beans>
在測試類中,修改代碼為:
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);
結果為:
2.使用annotation配置單例和多例
使用@Scope()標記在類上即可。