Spring XMLでコンストラクタを行う

SpringのXMLを使用してコンストラクタを行うサンプルです。
(確認環境:Spring 5.3.7、JDK 11、STS 4)

目次

サンプル Spring XMLでコンストラクタを行う
  1.XMLベースで実行する
  2.アノテーションベースで実行する(@Component)
  pom.xml

Spring XMLでコンストラクタを行う

コンストラクタインジェクションとも呼ばれます。
このページでは以下の2つの方法を紹介します。

1.XMLベースでコンストラクタを実行する。
2.アノテーションベースでコンストラクタを実行する。Spring 2.5から利用可能です。

両者ともStartApplication.javaのcontext.getBeanでbean(インスタンス)を取得しその際にコンストラクタを使用しメソッドを実行しHello Worldを表示します。

githubにコードがあります。(アノテーションベース)
https://github.com/ut23405/spring5/tree/master/spring-xml-construct

1.XMLベースで実行する

起動するファイル(StartApplication.java)

package com.example.test1;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StartApplication {
	public static void main(String[] args) {

		ClassPathXmlApplicationContext context = 
				new ClassPathXmlApplicationContext("applicationContext.xml");

		SyainService syainService 
				= (SyainService) context.getBean("testSyain");
		
		System.out.println(syainService.getHello()); //Hello World!
		context.close();
	}
}

9行目は、applicationContext.xmlを読み込みます。
12行目は、context.getBeanでDIコンテナからbean(インスタンス)を取得しています。
testSyainは、applicationContext.xmlの9行目のbeanのIDです。

設定ファイル(applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

	<bean id="testHello" class="com.example.test1.Hello"></bean>
	
    <bean id="testSyain" class="com.example.test1.Syain">
		<constructor-arg ref="testHello"></constructor-arg>
    </bean>
</beans>

7行目は、Helloクラスのbean(インスタンス)になります。
9行目は、Syainクラスのbean(インスタンス)になります。
10行目は、Syainクラスのコンストラクタの引数のHelloクラスです。constructor-argタグを使用します。ref="testHello"は7行目のtestHelloを指します。

SyainService.java

package com.example.test1;

public class SyainService  {
	private final Hello hello;
	
	public SyainService(Hello hello) {
		this.hello = hello;
	}
	public String getHello() {
		return hello.getHello();
	}
}

6行目は、SyainServiceクラスのコンストラクタです。
Helloクラスのインスタンスは、DIで6行目→7行目から4行目の変数にセットされます。
finalのため再代入不可になります。

Hello.java

package com.example.test1;

public class Hello {
	public String getHello() {
		return "Hello World!";
	}
}

メソッドは、文字列のHello Worldを返します。

実行する

StartApplication.javaを右クリックして「実行」→「Javaアプリケーション」をクリックするとコンソールにHello World!と表示されます。

 

2.アノテーションベースで実行する(@Component)

XMLファイルにcomponent-scanと対象のパッケージを記述し、対象のクラスに@Componetを追加します。XMLファイルにbeanを1つずつ定義する必要がなくなります。

起動するファイル(StartApplication.java)

package com.example.test1;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StartApplication {
	public static void main(String[] args) {

		ClassPathXmlApplicationContext context = 
				new ClassPathXmlApplicationContext("applicationContext.xml");

		SyainService syainService 
//				= (SyainService) context.getBean("testSyain");
				= context.getBean(SyainService.class);
		
		System.out.println(syainService.getHello()); //Hello World!
		context.close();
	}
}

12行目をコメントにし、13行目を追加します。

設定ファイル(applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.example.test1" />
</beans>

2~8行目をコピペし直します。このXMLにも意味があります。必要なものがないと動きません。
component-scanは、指定した配下がscanの対象になります。

SyainService.java

package com.example.test1;

import org.springframework.stereotype.Component;

@Component
public class SyainService  {
	private final Hello hello;
	
	public SyainService(Hello hello) {
		this.hello = hello;
	}
	public String getHello() {
		return hello.getHello();
	}
}

5行目に@Componetを追加します。
Helloクラスのインスタンスは、DIで9行目→10行目から7行目の変数にセットされます。
finalのため再代入不可になります。

Hello.java

package com.example.test1;

import org.springframework.stereotype.Component;

@Component
public class Hello {
	public String getHello() {
		return "Hello World!";
	}
}

5行目に@Componetを追加します。

実行する

StartApplication.javaを右クリックして「実行」→「Javaアプリケーション」をクリックするとコンソールにHello World!と表示されます。

pom.xml

	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.7</version>
		</dependency>
	</dependencies>

5行目のspring-contextは、applicationContext.xmlの読み込みや@Componentで使用します。

関連の記事

Spring XMLでhello worldを表示

△上に戻る