前に、以下の質問をされた際に、回答することができなかったので、
自分なりの言葉でまとめる。
-
@Controller
と@RestController
の違いはなんですか? - DIのメリットはなんですか?
1. @Controller
と @RestControler
の違い
@Controller
とは、「Thymeleafによって生成されたhtmlを返却する。」
@RestController
とは、「JSON、XMLを返却する。」
@Controller
@ResponseBody
public class hogeController {
}
上記のようにすれば@RestController
としたときと同じように、JSONを返すことができる。
2. DIのメリット
あるContoroller
のメソッドAの中で、ServiceのメソッドBを呼び出すために、
リクエストが来るたびにインスタンスの生成を行なっていては非常にメモリ効率が悪くなってしまう。
そのため、Springで管理しているDIコンテナ
からBean
として登録されているインスタンスを利用することによって、メモリ効率を上げれる。(DIコンテナではSingletonオブジェクトになるため、1つのインスタンスを再利用する。)
@RestController
public class Hoge {
@GetMapping("/hogehoge")
public FugaFuga hogeHoge () {
// リクエストのたびに毎回、newしなければならない...
Fuga fuga = new Fuga();
FugaFuga fugaFuga = fuga.getFugaFuga();
return fugaFuga;
}
}
@RestController
public class Hoge {
@Autowired
private Fuga fuga;
@GetMapping("/hogehoge")
public FugaFuga hogeHoge () {
// DIコンテナにBeanとして登録されているため、1つのインスタンス再利用する
// そのため、newをしなくてよくなった!
FugaFuga fugaFuga = fuga.getFugaFuga();
return fugaFuga;
}
こんな単純なことではないと思いますが、基礎中の基礎が理解できていなかったので反省...
業務では当たり前のように使用していたが、いざ言葉にするとなると、自分の知識の浅さにショックだった。
@Autowired
も非推奨な使い方を普段からしているので、その点もどこかで投稿する。