Spring Bean Scope 學習

在Spring中定義一個Bean時,可以針對其scope加以設定。在新版的Spring中,共有五種不同的scope可以設定,分別為:



  • singleton:在Spring IoC Container,該bean只會有單一實例(a single instance),此為Spring預設值
  • prototype:在Spring IoC Container中,該bean可以有多個實例(any number of object instances)
  • request: 在每一次的HTTP Request,spring container會根據loginAction bean的定義來建立一個全新的instance,而且僅在目前的request中有效,所以可以放心的去更改instance的內部狀態,請求結束,request scope的bean instance會被destroy
  • session:針對某個HTTP Session,spring container會根據userPreference bean的定義來建立一個全新的instance,同樣的,和request scope一樣,可以放心的去更改instance內部狀態。
  • global-session:僅在portlet為基礎的Web應用下有作用。Porlet的規範中定義了global session的概念。

在定義scope時,會在bean中定義如下:
<bean id="helloWorld" class="HelloWorld" scope="singleton">

當scope設定為singleton時,整個container只會有一個instance,所以下方的obj和obj1都會是同一個instance。
ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.setMessage("hello");
obj.getMessage();
HelloWorld obj1 = (HelloWorld) context.getBean("helloWorld");
obj1.getMessage();

<bean id="helloWorld" class="HelloWorld" scope="prototype">

如果設定為prototype時,obj和obj1將會是不同的instances,可以分別進行操作。在這裡,singleton的單一instance是用id來進行識別,不同id、相同class時,還是可以有多個instances(getBean傳入不同的id即可)。

request、session和global-session三種scope只能在web環境中使用,如果在非web環境設定,會出現【No Scope registered for scope 'request'】的錯誤。

Share this post!

Bookmark and Share

0 意見: