サービスの作成 - @Service
サービスには、@Service
を使用します。受け取った値をモデルにまとめて返却するだけの、非常にシンプルなサービスを、以下を参考に作成します。
// src/main/java/io/github/yo1000/sss/service/MemoService.java
package io.github.yo1000.sss.service;
import io.github.yo1000.sss.model.Memo;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class MemoService {
public Memo join(String memo, String author) {
Memo item = new Memo();
item.setMemo(memo);
item.setAuthor(author);
item.setCreated(new Date());
return item;
}
}
作成したサービスを使用するように、コントローラーを変更します。
// src/main/java/io/github/yo1000/sss/controller/page/MemoController.java
package io.github.yo1000.sss.controller.page;
import io.github.yo1000.sss.model.Memo;
import io.github.yo1000.sss.service.MemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@Controller
@RequestMapping("memo")
public class MemoController {
private MemoService memoService;
@Autowired
public MemoController(MemoService memoService) {
this.memoService = memoService;
}
@RequestMapping("")
public String get(Model model) {
List<Memo> items = new ArrayList<>();
items.add(getMemoService().join("Join Memo", "Join Author"));
model.addAttribute("items", items);
return "memo";
}
@RequestMapping("param/{memo:[a-zA-Z0-9]+}")
public String getParams(@PathVariable String memo,
@RequestParam(required = false, defaultValue = "Default Author") String author,
Model model) {
List<Memo> items = new ArrayList<>();
items.add(getMemoService().join(memo, author));
model.addAttribute("items", items);
return "memo";
}
@RequestMapping(value = "", method = RequestMethod.POST)
public String post(@ModelAttribute Memo item,
Model model) {
List<Memo> items = new ArrayList<>();
items.add(item);
model.addAttribute("items", items);
return "memo";
}
public MemoService getMemoService() {
return memoService;
}
}
アプリケーションを再起動して、改めて、http://localhost:8080/memo へアクセスします。
サービスでまとめられたモデルを受け取れたことが確認できました。
サービスでは、リクエスト、レスポンスに依存したような処理や、永続化処理は記述せず、業務の流れを表現するだけなので、特別なアノテーションや、変わった書き方は登場しません。
アノテーション
今回、新たに登場したアノテーションを簡単に説明しておきます。
@Service
サービスクラスに設定します。このアノテーションが設定されると、クラスが DI コンテナへの登録対象としてマークされます。
@Autowired
DI コンテナへ登録されたインスタンスを注入したい箇所に設定します。注入可能な箇所は、コンストラクター、フィールド、セッターメソッドの3箇所で、アノテーションもこの3箇所に設定可能です。
このような注入はそれぞれの箇所に応じて、コンストラクターインジェクション、フィールドインジェクション、セッターインジェクションと呼ばれます。
テストの行いやすさを考慮して、可能なかぎり、コンストラクターインジェクションを使用するようにしてください。コンストラクターにより、依存性を解決できるような作りを維持しておくと、テストを行う際の DI コンテナへの依存を抑制することができます。(なお、Spring Framework 4.3 以降では、コンストラクターインジェクションを行う場合、@Autowired
の設定を省略できるようになります。)
参考
サンプル
ここまでのコードサンプルは、以下より入手できます。
$ git clone -b chapter/4 https://github.com/yo1000/self-study-spring.git