本篇介紹Spring Bean中的scope屬性。

當我們在configuration metadata,也就是xml中定義<bean...> ... </bean>時,可定義這個bean的scope。

scope有下面6種模式,最下面三種僅用在網路應用程式:

singleton(預設)

prototype

request

session

global-session

application

 

singleton

singleton為預設。當Bean的scope為singleton時,一個IoC容器只會為這個Bean建立一個實例,這個Bean實例會被存於快取中,之後對於這個Bean的請求或參照都會傳回同樣的Bean。

觀察以下範例,此範例專案目錄結構同第一支Spring程式

Beans.xml...

...

Beans.xml即為之前提到的configuration metadata,此範例中只有一個Bean,即為id叫"helloWorld"的Bean。

這個Bean的類別定義為下面的HelloWorld。

 

HelloWorld.java...

...

用來定義Bean的類別。

 

MainApp.java...

...

第11行將HelloWorld型別的objA參照到Beans.xml中"helloWorld"這個Bean的實例。

第13行使用objA的setter方法將字串"objA的訊息"設定給objA的成員變數message。

第14行呼叫objA的getter方法印出objA的message。

第16行將HelloWorld型別的objB參照到Beans.xml中"helloWorld"這個Bean的實例。

第17行呼叫objB的getter方法印出objB的message。

 

MainApp.java的執行結果如下,可以看到第17行objB.getMessage();印出的結果同等於objA的message,由此可知若scope為singleton,則每次請求的Bean實例都是同一個。

-----------------------------------

 

prototype

當Bean的scope設為prototype,則每次請求Bean時,IoC容器會建立一個新的Bean,而不是傳回同一個Bean。

例如將上述範例Beams.xml第7行的Bean的scope改為prototype如下。

 

則MainApp.java的執行結果為

印出的第二行是objB的message,因為objB參照到的是新的Bean,而範例中並沒有設任何值給objB的message,所以印出的是null。

 

參考於

Spring Framework Reference Documentation

tutorialspoint

 

 

文章標籤
創作者介紹

菲比傻大姐&肉豬

phoebelin0606 發表在 痞客邦 PIXNET 留言(0) 人氣()