[Java][Spring] DIする方式を細かく見てみる① @ScopeでのSingletonとPrototypeの指定

公開日: : Java , , , , ,

今回は@Scopeアノテーションを用いて、オブジェクトをDIする方式を選択してみます。

●解説

@Scopeで指定可能な属性は以下となります。

@Scope("singleton") :
省略可能。Springコンテナ内に単一オブジェクトを生成し、常にそのオブジェクトがDIされる。
@Scope("prototype") :
指定必須。DIされる度にオブジェクトをnewする。

●サンプルプログラム

こちらの記事のサンプルプログラムを拡張しています。

・TestService.java
@scopeを省略しているので、singletonでDIされるオブジェクトとなります。

package test.spring3;

import org.springframework.stereotype.Component;

@Component
public class TestService {

	private int value = 0;

	public void exec(){
		System.out.println("exec()が実行されました。値は[" + this.value + "]です。");
	}

	public void setValue(int value){
		this.value = value;
	}
}

・TestServicePrototype.java
@scopeでprototypeの指定をしているので、毎回newでDIされるオブジェクトとなります。

package test.spring3;

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

@Component
@Scope("prototype")
public class TestServicePrototype {

	private int value = 0;

	public void exec(){
		System.out.println("exec()が実行されました。値は[" + this.value + "]です。");
	}

	public void setValue(int value){
		this.value = value;
	}
}

・App.java
TestServiceとTestServicePrototypeを2個ずつDIして動きの違いを確認しています。

package test.spring3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class App {

	@Autowired
	private TestService service1 = null;
	@Autowired
	private TestService service2 = null;
	@Autowired
	private TestServicePrototype servicePrototype1 = null;
	@Autowired
	private TestServicePrototype servicePrototype2 = null;

	public void execService(){
		service1.setValue(1);
		service2.setValue(2);
		service1.exec();
		service2.exec();
		System.out.println("service1とservice2は同じオブジェクト(Singleton)なので同一の値が出力される。");

		servicePrototype1.setValue(1);
		servicePrototype2.setValue(2);
		servicePrototype1.exec();
		servicePrototype2.exec();
		System.out.println("servicePrototype1とservicePrototype2は別のオブジェクト(Prototype)なので別の値が出力される。");
	}

	public static void main( String[] args ){

		// Springコンテナ取得
		ApplicationContext appContext =
				new ClassPathXmlApplicationContext("classpath:./META-INF/spring/app-context.xml");
		// SpringコンテナからAppクラスのオブジェクトを取得
		App app = appContext.getBean(App.class);
		// appを実行
		app.execService();
    }
}

・実効結果
実効結果は以下のとおりです。
singletonとprototypeの動きの違いが確認できます。

2013/12/02 13:20:56 org.springframework.context.support.AbstractApplicationContext prepareRefresh
情報: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@38503429: startup date [Mon Dec 02 13:20:56 JST 2013]; root of context hierarchy
2013/12/02 13:20:56 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
情報: Loading XML bean definitions from class path resource [META-INF/spring/app-context.xml]
2013/12/02 13:20:56 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
情報: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@217f242c: defining beans [app,testService,testServicePrototype,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
exec()が実行されました。値は[2]です。
exec()が実行されました。値は[2]です。
service1とservice2は同じオブジェクト(Singleton)なので同一の値が出力される。
exec()が実行されました。値は[1]です。
exec()が実行されました。値は[2]です。
servicePrototype1とservicePrototype2は別のオブジェクト(Prototype)なので別の値が出力される。

スポンサードリンク

関連記事

no image

[Java] 日付の計算方法(DateFormat、Date、Calendar)

こんにちは、kei0310です。 Javaで日付を計算する方法について解説します。 まず

記事を読む

no image

[Java][Servlet][JSP] ServletからJSPへの転送

こんにちは。 今回は、「Servletでリクエストを受けて、JSPで表示する。」方法を解説しま

記事を読む

no image

[Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成

こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解

記事を読む

no image

[java] 文字列の一部を切り取る方法(substring)

こんにちは。 今回は文字列の一部を切り取る方法について解説します。 具体的には、String

記事を読む

no image

[Java][Spring] Spring3でDIしてみる!(アノテーション使用)

Spring3を使って、一番基本的な形のプログラムを作成してみます。 今回は、アノテーションを

記事を読む

no image

[Java] 文字列の分割(split)

こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize

記事を読む

no image

[Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成

こんにちは、keiです。 今回はRESTfulなWeb Serviceの作成を行っていきます。

記事を読む

no image

[Java][基本] ループ処理(for文)

Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];

記事を読む

no image

[Java][Servlet] EclipseでのJavaServlet作成

こんにちは、今回はEclipseを使用してJavaServletを作成します。 Eclipse

記事を読む

no image

[Java] Javaのインストール(プログラム開発・入門用)

Javaのコードを書きたい!! という目的のためのJavaのインストール方法と、コマンドラインでの

記事を読む

スポンサードリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スポンサードリンク

no image
CentOSにdockerをインストールしてみた

前置き dockerをcentos7にインストールしてみました

no image
awkでのgsubを使った文字列置換(正規表現)

まえおき bashなどのシェルスクリプトで、lsした結果とかを

no image
bashで並列処理する方法(xargs)

並列処理とは 通常、意識せずにプログラムを書くと、大体の場合は

no image
AWS Redshiftの使用ストレージ容量をクエリで調べる方法

用途 AWS Redshfitのコンソールを見れば、使用中のス

no image
pythonでstorage transfer serviceを使ってみた。

準備 pythonのインストールとかする。 このあたり。

→もっと見る

  • 2025年6月
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30  
  • 2025年6月
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30  
PAGE TOP ↑