1. 程式人生 > >Spring學習之路--單例模式和多例模式

Spring學習之路--單例模式和多例模式

在Spring中,bean可以被定義為兩種模式:prototype(多例)和singleton(單例)

singleton(單例):只有一個共享的例項存在,所有對這個bean的請求都會返回這個唯一的例項。

prototype(多例):對這個bean的每次請求都會建立一個新的bean例項,類似於new。

Spring bean 預設是單例模式。

實戰演示:

程式碼詳見上一篇文章中的程式碼。

在配置檔案中,修改這句程式碼為:

1 <bean id="hi" class="com.test.Hi" init-method="init" scope="singleton">

在測試類中,修改程式碼為:

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

結果為:

結論:二個變數指向一個物件。

將配置檔案改為:

<bean id="hi" class="com.test.Hi" init-method="init" scope="prototype">

其他的不變,執行測試類,結果為:

結論:每次訪問bean,均建立一個新例項。

加註解@Scope("prototype"),也可以變成多例模式

轉載:https://www.cnblogs.com/pilihaotian/p/5810887.html

先看看spring的bean作用域有幾種,分別有啥不同。

spring bean作用域有以下5個:

singleton:單例模式,當spring建立applicationContext容器的時候,spring會欲初始化所有的該作用域例項,加上lazy-init就可以避免預處理;

prototype:原型模式,每次通過getBean獲取該bean就會新產生一個例項,建立後spring將不再對其管理;

====下面是在web專案下才用到的===

request:搞web的大家都應該明白request的域了吧,就是每次請求都新產生一個例項,和prototype不同就是建立後,接下來的管理,spring依然在監聽

session:每次會話,同上

global session:全域性的web域,類似於servlet中的application

好了,上面都說了spring的controller預設是單例,那很自然就是singleton了。

轉載於:http://www.cnblogs.com/zxf330301/articles/6105127.html