2013-04-01 39 views
0

根據springsource文檔,一個singleton範圍的bean僅在每個容器的
中實例化一次。例如,我有一個包含關於用戶的信息
的bean,其範圍爲UserDetails
以我main()方法:瞭解網絡應用程序中的彈簧豆的範圍

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"}); 
UserDetails ud1 = (UserDetails)context.getBean("userDetails"); 
custA.setAddress("Address set by ud1"); 
System.out.println("Address : " + ud1.getAddress()); 

UserDetails ud2 = (UserDetails)context.getBean("userDetails"); 
System.out.println("Address : " + ud2.getAddress()); 

的輸出將是

Address set by ud1 
Address set by ud1 

由於爲userDetails的是一個單獨的豆,通過ud2第二檢索將給出相同的結果UD1的。

NOW這裏是我的問題:
對於我的web應用程序,我有以下我dispatcher-servlet.xml.

<bean id="userDetails" class="com.mukund.DTO.UserDetails" /> 

第一個問題UserDetails豆:是單身的範圍是一個Web應用程序的默認太?
如果是:
此bean自動裝配到AccountServiceCustomerService類中。
如果客戶說clientA已設置用戶的名字「用戶A」中的CustomerService類和一段時間後,它的AccountService類檢索的第一個名字,

第二個問題:做它獲取相同的 UserDetails的實例與「UserA」作爲名?
第三個問題:同時,如果另一個客戶端說clientB試圖獲得AccountService類中的名字,它會得到「UserA」?
第四個問題:將由clientA,clientB和其他人共享相同的UserDetails實例嗎?如果是:選擇原型,請求或會話的範圍。

我希望你能理解我的觀點。請解釋我的春天豆作用域關於Web應用程序。

THANKS

回答

1

是單是Web應用程序的默認範圍。因此,您可以在所有服務(以及所有用戶)中獲得相同的UserDetails實例。

適合你的範圍取決於你確切需要什麼。你真的想將數據傳輸對象注入服務嗎?對象存在多久?

  • 原型範圍:每個服務都有自己的UserDetails對象
  • 請求範圍:你得到相同的實例的請求時
  • 會話範圍:您只要你在得到相同的實例同一屆會議。
+0

那麼在調度程序-servlet中定義爲hibernate sessionfactory bean爲」?如果是,所有用戶都將使用相同的sessionfactory,那麼它是否爲單例範圍的bean?如果是,那麼當'session.getCurrentSession'被調用時,所有會話都會得到相同的會話?請解釋我這個... – mukund

+1

是的sessionfactory是一個單身人士。 SessionFactory是一個重量級的單例風格對象,而會話只存在於「短」時間跨度。詳細信息以及'current session'的含義在hibernate文檔中有很好的解釋:http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/context/CurrentSessionContext.html(只需檢查子類與您的應用程序相匹配)。請注意,創建SessionFactory的標準Spring方法是http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/orm/hibernate3/LocalSessionFactoryBean.html – micha

+1

Singleton作用域爲默認值對於Spring來說,無論是哪種應用程序。無狀態bean應該被標記爲單例或請求,有狀態bean可以是會話作用域的原型,具體取決於你想要使用它們多長時間。 –

-1

默認情況下,spring bean的範圍是singleton,表示每個容器一個實例。 但這並不意味着所有請求都使用相同的實例。

它的工作原理是這樣的。

的豆客戶端的請求,容器會查找這個bean的實例,如果實例不存在,它會創建一個實例,然後將它交給客戶端A

但如果豆A正在被另一個客戶端B使用,那麼客戶端A必須等到客戶端B釋放該bean A.

+1

這是不正確的,你的意思是說,單身對象被鎖定,直到它在客戶端B中使用,這可以很容易地爲應用程序創建一個瓶頸。 –

+1

這是真的,這就是爲什麼只有無狀態bean被定義爲spring beans。例如,很容易成爲singleton的bean是DAO,Service,Controller,這些bean沒有自己的狀態,我們利用這些bean在我們的應用程序中執行某些操作。選擇一個需要保持狀態的Singleton bean是一個糟糕的設計模式 – NullPointerException