その1:Hello world
その1で、Springを使ってハローワールド的なことをやりました。
使ってる機能としては、DIコンテナとしてのSpring Frameworkの一番基本的な機能を使ってます。
使うクラスをbeanタグで定義して、propertyタグを使って組み立てていく。
ほかにも色々あったりはするけど、基本的にはここに行き着きます。
ということで、ちょっと考えればわかることですが、クラス数が増えるとXML地獄に突入してしまいます。
Spring Framework 2から、そこらへんを改善しようと色々な改善点が追加されました。今回題材にしているSpring Framework 2.5からは、アノテーションのついているクラスを自動的にコンテナに登録してくれる機能がつきました。
今回は、その機能を使ってハローワールドを書き直してみようと思います。
アノテーションをつけるよ
作り直しといっても、全部を書き直すのではなくて、基本的にちょっとの修正と、application.xmlを書き直すくらいです。
まずは、自動登録してもらうために、HelloLogicとHelloServiceにアノテーションを追加します。
まずは、HelloLogicクラスから。
使うアノテーションは、org.springframework.stereotype.Componentアノテーションになります。
このアノテーションをクラスにつけることで、自動登録の対象となります。
Componentアノテーションの他に、以下のアノテーションでも自動登録がされます。
- @Service
サービス層のクラスにつける - @Controller
コントローラにつける - @Repository
永続化層につける
自動登録されたクラスは、クラス名の最初の1文字を小文字にした名前で登録されるみたいです。
HelloLogicクラスならhelloLogicみたいに。
今回は、別に層とかあまり考えていないのでComponentアノテーションを使います。
package springhello.logic;
import org.springframework.stereotype.Component;
@Component
public class HelloLogic {
public String execute() {
return "こんにちは";
}
}
次にHelloServiceクラスです。こちらは、HelloLogicクラスをインジェクションしてもらわないといけないので、その旨をあらわすアノテーションも使います。
使うアノテーションは、org.springframework.beans.factory.annotation.Autowiredアノテーションになります。
これをセッターあたりにつけておくと、自動的に型から適切なクラスをインジェクションしてくれます。
package springhello.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import springhello.logic.HelloLogic;
@Component
public class HelloService {
private HelloLogic logic;
public String execute() {
return logic.execute() + "世界";
}
@Autowired
public void setLogic(HelloLogic logic) {
this.logic = logic;
}
}
application.xmlの作り直し
最後に、application.xmlの作り直しをします。
一度application.xmlを削除して、新規作成からSpring XML構成ファイルを選択します。
Spring名前空間で、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-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
</beans>
xmlns:contextというものとxsi:schemaLocationにspring-context-2.5.xsdが追加されているのがわかります。
Spring Framework 2から、このようにxsdを使ってタグを拡張することが出来るようになっています。
このXMLに1行追加します。
<context:component-scan base-package="springhello" />
component-scanというタグは、base-packageで指定したパッケージ以下を走査して、クラスを登録する動きをします。登録されるクラスは、先ほどのようにアノテーションを追加されたクラスになります。
たった1行で、クラスが増えてもXMLは増えない素敵な状況になりました。
早速実行してみると…
package springhello;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springhello.services.HelloService;
public class Main {
public static void main(String[] args) {
// mainはそのまま
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"springhello/application.xml");
HelloService service = (HelloService) ctx.getBean("helloService");
String message = service.execute();
System.out.println(message);
}
}
「こんにちは世界」ときちんと表示されます。
うん。素敵だ。