🐥
Spring Bootを学習したので忘れたくない
Spring Frameworkとは?
- Dependency Injection
- Spring系のエコシステム
- @component, @Autowired, component scanとか
Spring MVCとは?
- web appやREST APIアプリを作成するためのもの
- @Controller, @RestController, @RequestMapping,,,
Spring Bootとは
- 素早く簡単に本番環境のようなアプリを作成できる。
- Spring inicializerというやつですぐプロジェクトを作成できる
- Spring FrameworkとかSpring MVCにはたくさんのめんどくさい設定があるけどSpring Bootを使えばそれらをまとめて簡単に使えるようにしてくれる。
- アプリケーションを管理するためのActuaterというものがあり、これでメトリクスとか見れる
- jarファイルにtomcatなどのサーバが入っている。
- profilesを使用して、環境ごとの設定が簡単にできる。
Spring Container & Spring Context & Spring IOC
- これらは全て同じ意味(spring container, spring context, spring IOC)
- Spring Containerとは?
- Spring Contextとは?
- Spring IOCとは?
- Bean Factoryとは?
- Application contextとは?
Spring MVC 概念図
- Front ControllerがHTTPリクエストを受け取る
- httpリクエストを紐付けられたコントローラーメソッドに渡す
- コントローラーメソッドを実行
- コントローラーメソッドがviewを返し、view resolverが紐づけられたviewを返す
- httpレスポンスを返す
トラブルシューティング
ログレベルをDEBUGにする
エラーの内容を見るには下記を設定する。
$ cat application.properties
logging.level.org.springframework=DEBUG
ロギングについて
spring bootにおいてロギングはapplication設定ファイルからパッケージごとにログレベルを設定できる。
# springboot全体でログレベルをDEBUGに設定
logging.level.org.springframework=INFO
# com.ems.ems.helloパッケージのみログレベルをDEBUGに設定
logging.level.com.ems.ems.hello=DEBUG
package com.ems.ems.hello;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class SayHelloController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
アノテーションについて
@Controller, @RequestMapping
- @Controller:コントローラークラスには大体つける。これをつけることでSpring BeanにSpringクラスとして登録されるので、つけるの必須。つけないと読み込まれない。
- @RequestMapping:URLのパスと起動する関数を結びつける。
package com.ems.ems.hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class SayHelloController {
// say hello
// localhost:8080/say-hello -> "Hello World"
@RequestMapping("/say-hello")
@ResponseBody
public String sayHello() {
return "Hello World";
}
}
@RequestParam
/say-hello-name?name=john
にアクセスした場合
@RequestMapping("/say-hello-name")
@ResponseBody
public String sayHelloName(@RequestParam String name) {
return "Hello World: " + name;
}
/say-hello-name?info=john
にアクセスした場合
ログ
Could not resolve parameter [0] in public java.lang.String com.ems.ems.hello.SayHelloController.sayHelloName(java.lang.String): Required request parameter 'name' for method parameter type String is not present
Discussion