こんにちは、鈴木です。
ここしばらく Ruby/Rails ばかりだったので、すっかり Java 事情に疎くなってしまいました。
ということで Maven3 と Spring4 で Hello, World やります!
Spring って最新は 3 では?と思った方もいらっしゃるかも知れません。僕も「最新は Spring3 だったかなー」と思っていたのですが、2013/12/12 に 4.0.0 がリリースされています。(see Announcing Spring Framework 4.0 GA Release )
ということで Spring4 で Hello, World やります!
あと、Maven も使います。Maven の最新バージョンは 3.1.1 ですね。依存ライブラリの管理には Ivy や Gradle も選択肢としてあるのですが、最近の主流はどれなんでしょうか。「これいいよー」などありましたら教えてくださいな。
Maven のインストール
Maven は以下のサイトでダウンロードできます。
ダウンロードして展開してパスを通せば準備 OK です。
プロジェクトを作る
Maven でプロジェクトを作ります。
| 
					 1  | 
						mvn archetype:create -DgroupId=com.example.spring4.hello -DartifactId=hello  | 
					
実行すると hello というディレクトリが作成されます。
pom.xml に Spring4 を追加する
まずは pom.xml を以下のように編集しましょう。
コメントで「追加 - ここから」と「追加 - ここまで」と書いた範囲を追加しました。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32  | 
						<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>com.example.spring4</groupId>   <artifactId>hello</artifactId>   <version>1.0-SNAPSHOT</version>   <packaging>jar</packaging>   <name>hello</name>   <url>http://maven.apache.org</url>   <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   </properties>   <dependencies>     <dependency>       <groupId>junit</groupId>       <artifactId>junit</artifactId>       <version>3.8.1</version>       <scope>test</scope>     </dependency>     <!-- 追加 - ここから -->     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-context</artifactId>       <version>4.0.0.RELEASE</version>     </dependency>     <!-- 追加 - ここまで -->   </dependencies> </project>  | 
					
HelloService インタフェースを作る
HelloService というインタフェースを作成します。(src/com/example/spring4/hello/HelloService.java)
| 
					 1 2 3 4 5 6 7  | 
						package com.example.spring4.hello; public interface HelloService {     public String getMessage(); }  | 
					
実装クラスの getMessage() で「Hello, World!」と返す予定です。
HelloServiceImpl クラスを作る
次に HelloService の実装クラスを作ります。(src/com/example/spring4/hello/HelloServiceImpl.java)
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						package com.example.spring4.hello; import org.springframework.stereotype.Component; @Component public class HelloServiceImpl implements HelloService {     public String getMessage() {         return "Hello, World!";     } }  | 
					
getMessage() で「Hello, World!」と返すように実装しました。
@Component を付けておくと Spring コンテナによってコンポーネントとして自動検出されるようになります。つまり、DI したい実装クラスには @Component を付けるということです。
HelloWorldPrinter を作る
次は HelloService を使ってメッセージを表示する HelloWorldPrinter クラスを作ります。(src/com/example/spring4/hello/HelloWorldPrinter.java)
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						package com.example.spring4.hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class HelloWorldPrinter {     @Autowired     private HelloService helloService;     public void run() {         System.out.println(helloService.getMessage());     } }  | 
					
HelloWorldPrinter 自身も Spring コンテナに登録するので @Component を付けています。helloService フィールドに @Autowired を付けていますが、これは Spring コンテナから型の合うコンポーネントを自動的に DI してもらうためのものです。
run() メソッドでは helloService#getMessage() の結果を単純に出力しています。
App クラスを作る
最後に動作確認用のコードを書きます。(src/com/example/spring4/hello/App.java)
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | 
						package com.example.spring4.hello; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class App {     public static void main(String[] args) {         ApplicationContext context = new AnnotationConfigApplicationContext(App.class);         context.getBean(HelloWorldPrinter.class).run();     } }  | 
					
AnnotationConfigApplicationContext を new して、それから取り出した HelloWorldPrinter の run() メソッドを呼び出しています。
App クラスに付けているアノテーションですが、@ComponentScan は @Configuration を付けたクラスで Spring コンテナが管理するコンポーネントを使うよー、と伝えるためのものです。
実行する
それではコンパイルして実行してみます。
| 
					 1  | 
						mvn compile exec:java -Dexec.mainClass=com.example.spring4.hello.App  | 
					
きちんと「Hello, World!」と表示されました。
| 
					 1 2 3 4 5  | 
						... 2014/01/02 9:43:08 org.springframework.context.support.AbstractApplicationContext prepareRefresh 情報: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1ba92db: startup date [Thu Jan 02 09:43:08 JST 2014]; root of context hierarchy Hello, world! ...  | 
					
Hello, World! してみて
久しぶりの Java でしたが、Maven3 と Spring4 を使って無事に Hello, World することができました。
設定ファイルを書かずにアノテーションベースでできるのは便利で良いですね。

