こんにちは、北川です。
鈴木さんの、「Maven3 と Spring4 で Hello, World」 の記事読んで Gradle イイヨ!
と勧めたくなったので Gradle と Spring4 で Hello, World やります。
流れは、「Maven3 と Spring4 で Hello, World」と全く同じですで
冗長な部分もありますがご了承ください。
Gradle のインストール
Gradleは以下のサイトでダウンロードできます。
ダウンロードして展開してパスを通せば準備 OK です。
プロジェクトを作る
Gradleでプロジェクトを作ります。
1 2 3 |
mkdir hello cd hello gradle init --type java-library |
実行すると hello というgradleプロジェクトの雛形が作成されます。
build.gradle に Spring4 を追加する
まずは build.gradle を以下のように編集しましょう。
コメントで「追加 - ここから」と「追加 - ここまで」と書いた範囲を追加しました。
1 2 3 4 5 6 7 8 9 10 |
dependencies { // The production code uses the SLF4J logging API at compile time compile 'org.slf4j:slf4j-api:1.7.5' // 追加 - ここから compile 'org.springframework:spring-context:4.0.0.RELEASE' // 追加 - ここまで // Declare the dependency for your favourite test framework you want to use in your tests. // TestNG is also supported by the Gradle Test task. Just change the |
HelloService インタフェースを作る
HelloService というインタフェースを作成します。(src/main/java/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/main/java/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/main/java/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/main/java/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 コンテナが管理するコンポーネントを使うよー、と伝えるためのものです。
実行する
それではコンパイルして実行してみます。
実行するために build.gradle に task を追加します。
末尾に下記を追加します。
1 2 3 4 |
task(hello, dependsOn: 'classes', type: JavaExec) { main = 'com.example.spring4.hello.App' classpath = sourceSets.main.runtimeClasspath } |
それではタスクを実行してみます。
1 |
gradle hello |
きちんと「Hello, World!」と表示されました。
1 2 3 |
1 06, 2014 8:00:57 午後 org.springframework.context.support.AbstractApplicationContext prepareRefresh 情報: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@68207d99: startup date [Mon Jan 06 20:00:57 JST 2014]; root of context hierarchy Hello, World! |
Hello, World! してみて
冒頭にも記載しましたが「Maven3 と Spring4 で Hello, World」のGradle 版です。
Gradle の方が簡潔に書けXMLベースでないのが個人的には好きです。