Springでは、Beanスコープを使用して、Springコンテナから呼び出し元に返すBeanインスタンスのタイプを決定します。

サポートされている5種類のBeanスコープ:

  1. singleton – Spring IoCコンテナごとに単一のBeanインスタンスを返す

  2. prototype – リクエストされるたびに新しいBeanインスタンスを返す

  3. request – HTTPリクエストごとに単一のBeanインスタンスを返します. **

  4. session – HTTPセッションごとに1つのBeanインスタンスを返します. **

  5. globalSession – グローバルHTTPセッションごとに単一のBeanインスタンスを返します.

**

ほとんどの場合、Springのコアスコープ(シングルトンとプロトタイプ)のみを扱うことができ、デフォルトスコープはシングルトンです。


P.S ** は、Web対応のSpring ApplicationContext

のコンテキストでのみ有効であることを意味します

シングルトン対プロトタイプ

ここでは、Beanスコープの違いを示す例を示します。

package com.mkyong.customer.services;

public class CustomerService
{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

1.シングルトンの例

Bean設定ファイルにBeanスコープが指定されていない場合は、デフォルトでシングルトンになります。

<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-2.5.xsd">

       <bean id="customerService"
            class="com.mkyong.customer.services.CustomerService"/>

</beans>

それを実行します

package com.mkyong.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mkyong.customer.services.CustomerService;

public class App
{
    public static void main( String[]args )
    {
        ApplicationContext context =
         new ClassPathXmlApplicationContext(new String[]{"Spring-Customer.xml"});

        CustomerService custA = (CustomerService)context.getBean("customerService");
        custA.setMessage("Message by custA");
        System.out.println("Message : " + custA.getMessage());

       //retrieve it again
        CustomerService custB = (CustomerService)context.getBean("customerService");
        System.out.println("Message : " + custB.getMessage());
    }
}

出力

Message : Message by custA
Message : Message by custA

Bean ‘customerService’はシングルトンスコープにあるため、 ‘custB’による2回目の検索では、新しいgetBean()メソッドで取得した場合でも ‘custA’によって設定されたメッセージが表示されます。 Singletonでは、Spring IoCコンテナごとに1つのインスタンスしかなく、getBean()で何回取得しても、常に同じインスタンスが返されます。

2.プロトタイプの例

新しい ‘customerService’ Beanインスタンスが必要な場合は、そのたびにプロトタイプを使用してください。

<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-2.5.xsd">

   <bean id="customerService" class="com.mkyong.customer.services.CustomerService"
         scope="prototype"/>

</beans>

もう一度実行してください

Message : Message by custA
Message : null

プロトタイプのスコープでは、呼び出される各 `getBean()`メソッドの新しいインスタンスが作成されます。

3.ビーンスコープの注釈

注釈を使用してBeanのスコープを定義することもできます。

package com.mkyong.customer.services;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service
@Scope("prototype")
public class CustomerService
{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

自動コンポーネントスキャンを有効にする

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">

       <context:component-scan base-package="com.mkyong.customer"/>

</beans>

ソースコードをダウンロードする

ダウンロードする – リンク://wp-content/uploads/2010/03/Spring-Bean-Scopes-Example.zip[Spring-Bean-Scopes-Example.zip](7 KB)