山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

Spring4 アノテーションコンフィグ

前の記事でSpringのXMLコンフィグを用いてクラスをSpringコンテナに登録するサンプルを紹介した。

yyama1556.hateblo.jp


今回は、それをアノテーションコンフィグに直してみる。

フォルダ構成

次のようなフォルダ構成を前提としている。

f:id:yyama1556:20160809140317p:plain

前回使ったサンプルのソース

前回使ったサンプルのソースを再掲する。

本題とはあまり関係がないがpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.samples</groupId>
  <artifactId>Sample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>

		<!-- Generic properties -->
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<!-- Spring -->
		<spring-framework.version>4.3.2.RELEASE</spring-framework.version>

	</properties>
	
	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

	</dependencies>	
</project>

続いてMainクラス

package org.yyama;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String... args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		Main tMain = ctx.getBean(Main.class);
		tMain.proc();
		ctx.close();
	}

	public void proc() {
		System.out.println("procの中");
	}
}

最後にapplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<?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 class="org.yyama.Main" />
</beans>

修正後のソース

applicationContext.xmlとMainクラスの2本を修正する。

まず、Mainクラスだが、クラス宣言の前に[@Component]を追加するだけ。当然、[import org.springframework.stereotype.Component]の記載も必要になるので、厳密には2行追加する。

package org.yyama;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class Main {
	public static void main(String... args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		Main tMain = ctx.getBean(Main.class);
		tMain.proc();
		ctx.close();
	}

	public void proc() {
		System.out.println("procの中");
	}
}

そしてapplicationContext.xml。[bean]タグの変わりに、[context:component-scan]タグを使用するのと、contextスキーマを宣言する。

<?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="org.yyama" />
</beans>

実行

実行すると前回同様、"procの中"という文字列が出力される。

8 09, 2016 2:49:15 午後 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
情報: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Tue Aug 09 14:49:15 JST 2016]; root of context hierarchy
8 09, 2016 2:49:15 午後 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
情報: Loading XML bean definitions from class path resource [applicationContext.xml]
procの中
8 09, 2016 2:49:15 午後 org.springframework.context.support.ClassPathXmlApplicationContext doClose
情報: Closing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Tue Aug 09 14:49:15 JST 2016]; root of context hierarchy

まとめ

<context:component-scan base-package="org.yyama" />

この記載で、org.yyamaパッケージ配下で@Componentがついているクラスを自動でコンテキストに登録してくれる。

前回学習した、XMLコンフィグの問題点として容易に想像できるのが、アプリケーションが大きくなったらXMLファイルもどんどん大きくなって、Struts時代のXML地獄に逆戻りになってしまうことだ。

その問題を解消するのが、アノテーションコンフィグであり、先ほどの1文でパッケージ配下のクラスをすべてコンテキストに登録してくれるので、クラス数が増えても、XMLの記述量を増やす必要がなくなる。

今日はここまで。


Spring 関連記事へのリンク集つくりました。