Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

What's new in Spring Boot 2.6 ?

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio

Eche un vistazo a continuación

1 de 46 Anuncio

What's new in Spring Boot 2.6 ?

Descargar para leer sin conexión

2021年の11月にSpring Boot 2.6がリリースされました。
これまでと大きく変わる訳ではありませんが、変更点を知っておくに越したことはありません。
本資料では、主な変更点を、余談を交えながら解説します。

2021年の11月にSpring Boot 2.6がリリースされました。
これまでと大きく変わる訳ではありませんが、変更点を知っておくに越したことはありません。
本資料では、主な変更点を、余談を交えながら解説します。

Anuncio
Anuncio

Más Contenido Relacionado

Presentaciones para usted (20)

Similares a What's new in Spring Boot 2.6 ? (20)

Anuncio

Más de 土岐 孝平 (12)

Más reciente (20)

Anuncio

What's new in Spring Boot 2.6 ?

  1. 1. 1 What's new in Spring Boot 2.6 ? 2022/03/30 日本Springユーザ会 土岐 孝平
  2. 2. 自己紹介 • 土岐 孝平 • 合同会社 現場指向 – Springのオンライン研修 – スポット技術支援 – メモラキー • 書籍の執筆 2 [改訂新版]Spring入門 OpenID Connect入門 「ゼロ・トゥー・ヒーロー with Spring」 ~ 5日間でゼロから即戦力へ ~ 現場指向 🔍 4月開催 ☆限定割引中☆
  3. 3. Spring Bootのリリーススケジュール • 5月と11月にマイナーもしくはメジャーバージョンがリリースさ れる • 去年の11月にバージョン2.6がリリースされた • 今年の5月に2.7がリリース予定 • 今年の11月に3.0がリリース予定 3 https://github.com/spring-projects/spring- boot/wiki/Supported-Versions#release-schedule
  4. 4. 2.6の変更点の確認方法 • リリースノートを確認する – https://github.com/spring-projects/spring-boot/wiki/Spring-Boot- 2.6-Release-Notes • 中の人の動画を見る – Spring Boot開発者のPhilさん • https://tanzu.vmware.com/content/webinars/feb-1-whats- new-in-spring-boot-2-6 – SpringアドボケイトのDanさん • https://www.youtube.com/watch?v=4L4LEnawcO8&t=195s • https://www.youtube.com/watch?v=2c3mNINiMTk 4 おすすめ
  5. 5. 発表の概要 • Spring Bootの開発者Philさんの動画(ウェビナー) の中で紹介された内容をベースに変更点を紹介。 動画を見ながら個人的に気になったことを余談で紹 介 • Philさんの動画 – https://tanzu.vmware.com/content/webinars/feb-1- whats-new-in-spring-boot-2-6 5
  6. 6. 紹介する変更点 • 旧バージョンから変わったこと – 循環参照がデフォルト禁止 – Spring MVCのパスマッチングの実装が変わった – 「info.xxx」プロパティがデフォルト無効 – recordクラスの@ConstructorBindingが不要 • 新しく追加された機能 – SameSiteクッキーの設定が可能 – Actuatorで秘密情報をサニタイズするIFが追加された – @AutoConfigureMockMvcでWebTestClientが利用可 能 – infoエンドポイントでJava実行環境の情報を取得可能 – 起動時間のメトリクスが取得可能 6
  7. 7. 旧バージョンから変わったこと • 循環参照がデフォルト禁止 • Spring MVCのパスマッチングの実装が変わった • 「info.xxx」プロパティがデフォルト無効 • recordクラスの@ConstructorBindingが不要 7
  8. 8. 循環参照がデフォルト禁止 • 循環参照とは? – オブジェクト同士が循環して参照すること • プログラム修正時の影響範囲が特定しにくいため、 一般的に「よろしくない」とされる 8 A B A B C
  9. 9. 2.5までの挙動 • フィールドインジェクション、セッターインジェクションであれば 、Bean間で循環参照が可能 • コンストラクタインジェクションは循環参照が不可(例外が発 生する) – Aをnewするには事前にBが必要だが、Bをnewするためには事前に Aが必要、という不可能な状態になるため 9 A B Spring ③インジェクション ④インジェクション ①new ②new A B Spring ②new&インジェクション ①new&インジェクション
  10. 10. 2.6の挙動 • フィールドインジェクション、セッターインジェクションもデフォ ルトで循環参照が不可 – ただし、設定で可能にすることができる • 「spring.main.allow-circular-references=true」 • コンストラクタインジェクションもこれまでどおり不可 – 「spring.main.allow-circular-references=true」も効かない 10 A B Spring ③インジェクション ④インジェクション ①new ②new A B Spring ②new&インジェクション ①new&インジェクション
  11. 11. 余談:コンストラクタインジェクションが奨励の訳 • ただし、理由は記載されていない • 一般的と思われる見解 – うっかり循環参照になるのを防ぐ(今回の変更でアドバン テージが無くなった) – 変更不可にできる(フィールドにfinalが付けれる) 11 出典:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
  12. 12. 余談のつづき:動画の中のコメント • コンストラクタが呼び出された時点で依存オブジェクトが全て 揃うので、初期処理のときに@PostConstruct等を使わなく てもいいのでクリーン(土岐訳) 12 @Service public class FooService { @Autowired private FooDao fooDao; public FooService() { } @PostConstruct public void init() { fooDao.doSomething(); } ・・・ @Service public class FooService { private final FooDao fooDao; public FooService(FooDao fooDao) { this.fooDao = fooDao; init(); } public void init() { fooDao.doSomething(); } ・・・
  13. 13. 旧バージョンから変わったこと • 循環参照がデフォルト禁止 • Spring MVCのパスマッチングの実装が変わった • 「info.xxx」プロパティがデフォルト無効 • recordクラスの@ConstructorBindingが不要 13
  14. 14. Spring MVCのパスマッチングの実装が変わった • パスマッチングがでてくる箇所 – Spring MVC • @GetMapping("/foo"), @PostMapping("/foo"), ... – Spring Security • mvcMatchers("/foo") • AntPathMatcherから、PathPatternParserに変わっ た – 基本的には性能改善が目的の様子 – 使い方はほぼ同じだが、違いもある – 設定で元に戻すことも可能 • 「spring.mvc.pathmatch.matching-strategy=ant- path-matcher」 14
  15. 15. AntPathMatcherとPathPatternParserの違い • パスの途中の「**」が利用不可に(起動時にエラー) • 同じ名前のパス変数が不可に(起動時にエラー) 15 @GetMapping("/foo/**/bar") public String foobar() { return "Foo Bar!"; } @GetMapping("/hello/{name}/{name}") public String hello(@PathVariable String name) { return "Hello " + name; } 旧バージョンだと、2つ目の{name}の値が 引数のnameに入る
  16. 16. Spring Securityでの注意点 • 先頭の「/」を厳密にマッチさせるようになった • 「/admin/secret」にアクセスがあった場合、has Authority("ADMIN")の権限チェックが行われない – その下のpermitAll()になってしまう • 権限チェックが行われるようにするには、「 .mvcMatchers("/admin/secret")」にする必要がある 16 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeHttpRequests() .mvcMatchers("admin/secret").hasAuthority("ADMIN") .anyRequest().permitAll(); }
  17. 17. 旧バージョンから変わったこと • 循環参照がデフォルト禁止 • Spring MVCのパスマッチングの実装が変わった • 「info.xxx」プロパティがデフォルト無効 • recordクラスの@ConstructorBindingが不要 17
  18. 18. 「info.xxx」プロパティがデフォルト無効 • 「info.xxx」プロパティとは? – 「info.xxx=yyy」指定すると、Actuatorのinfoエンドポイント で「xxx: "yyy"」が取得できる – セキュリティ的な理由でデフォルトが無効となった様子 • この機能を知らずにうっかりActuatorで公開してしまう など – 有効にするには以下を設定 • management.info.env.enabled=true 18 info.aaa=11111 info.bbb=22222 application.properties {"aaa":"111111111", "bbb":"222222222"} /actuator/info
  19. 19. 余談:infoエンドポイントで動的な値を取得する • InfoContributorを実装してBeanに登録するだけ 19 @Component public class FooInfoContributor implements InfoContributor { @Override public void contribute(Builder builder) { builder.withDetail("foo", LocalDateTime.now()); } } {"foo":"2022-03-20T10:10:08.3491234"} /actuator/info
  20. 20. 旧バージョンから変わったこと • 循環参照がデフォルト禁止 • Spring MVCのパスマッチングの実装が変わった • 「info.xxx」プロパティがデフォルト無効 • recordクラスの@ConstructorBindingが不要 20
  21. 21. recordクラスの@ConstructorBindingが不要 • recordクラスとは? – Java 16から追加された言語仕様 – コンストラクタ、Getter、toString、equals、hashCodeが 自動生成される 21 public record FooProps(String abc, String def) { } FooRecord fooProps = new FooProps("xxx", "yyy"); System.out.println(fooProps.abc() + ":" + fooProps.def()); // 「xxx : yyy」が出力される public record FooProps(String abc, String def) { public String concat() { return this.abc + this.def; } } メソッドも作れる。 ※フィールドはfinalなので変 更不可 コンストラクタやGetterが 自動生成されている
  22. 22. recordクラスの@ConstructorBindingが不要 • @ConfigurationPropertiesでrecordクラスにプロパ ティを格納する際@ConstructorBindingが不要 – ※ただし、コンストラクタを複数定義した場合は必要 22 @ConfigurationProperties(prefix = "foo") @ConstructorBinding public record FooProps(String abc, String def) { } @ConfigurationProperties(prefix = "foo") public record FooProps(String abc, String def) { } recordではない通常のクラスの場合は @ConstructorBindingが必要 (理由は不明) foo.abc=xxx foo.def=yyy 不要になった
  23. 23. 余談:recordクラスのアクセサーのJavadoc • Javadocを簡単に記述する方法が無さそうなのが残 念 – アクセサーをオーバーライドしてJavadocを書かないとい けない様子 23 public record FooProps(String abc, String def) { /** * ABCを返す * @return */ public String abc() { return this.abc; } } これは避けたい
  24. 24. 新しく追加された機能 • SameSiteクッキーの設定が可能 • Actuatorで秘密情報をサニタイズするIFが追加され た • @AutoConfigureMockMvcでWebTestClientが利 用可能 • infoエンドポイントでJava実行環境の情報を取得可 能 • 起動時間のメトリクスが取得可能 24
  25. 25. SameSiteクッキーの設定が可能 • SameSiteクッキーとは? – 外部のサイトの画面からアクセスされた際、送信を制限 するクッキーの属性 25 外部のサイト <html> <img src="www.me.com/foo"> </html> www.other.com www.me.com 自分のサイト www.me.comのクッキー(セッションIDな ど)を送信するか? ネットワーク負荷や、CSRFのリスクを加 味すると、不要であれば送信しない方が よい ブラウザ
  26. 26. SameSiteの属性値の種類 • Strict – 送信しない • None – 送信する • Lax – リンクなどユーザのアクションでアクセスされたときだけ送 信する 26 <html> <img src="www.me.com/foo"> <a href=" www.me.com/foo">リンク</a> </html> リンクで辿った場合は送信 www.other.comの画面 こっちは送 信しない
  27. 27. Spring Bootで設定可能 • セッションIDの場合 – server.servlet.session.cookie.same-site=lax • それ以外の場合 – 新しく追加されたCookieSameSiteSupplierを使用する 27 @Bean public CookieSameSiteSupplier cookieSameSiteSupplier() { return CookieSameSiteSupplier.ofLax() .whenHasNameMatching("myapp.*"); } @GetMapping("/cookie") public String foo(HttpServletResponse res) { res.addCookie(new Cookie("myapp_abc", "pppppppp")); return "foo"; } Java標準だとSameSiteを 設定するメソッドが無い Spring Bootが上手いこと 設定してくれる Set-Cookie: JSESSIONID=xxx; Path=/; HttpOnly; SameSite=Lax
  28. 28. 新しく追加された機能 • SameSiteクッキーの設定が可能 • Actuatorで秘密情報をサニタイズするIFが追加さ れた • @AutoConfigureMockMvcでWebTestClientが利 用可能 • infoエンドポイントでJava実行環境の情報を取得可 能 • 起動時間のメトリクスが取得可能 28
  29. 29. Actuatorのサニタイズ • Actuatorには、envエンドポイントとconfigpropsエン ドポイントで、秘密と思われるプロパティの値をサニ タイズしてくれる 29 /actuator/env some.secret=secret123 some.key=key123 some.maskme.value=hideme123 management.endpoint.env.additional-keys-to-sanitize=.*hideme.* application.properties
  30. 30. Actuatorのサニタイズに対する要望 • プロパティの取得元(PropertySource)毎にマスクし たいという要望があった – https://github.com/spring-projects/spring- boot/issues/6587 30 秘密A=secretA 秘密B=secretB 秘密C=secretC secret.properties /actuator/env 情報A: aaa 情報B: bbb 情報C: ccc 秘密A: ****** 秘密B: ****** 秘密C: ****** 情報A=aaa 情報B=bbb 情報C=ccc nosecret.properties プロパティ名を問わず全 てサニタイズしたい
  31. 31. SanitizingFunctionインタフェース • SanitizingFunctionインタフェースが追加された – プロパティの取得元(PropertySource)に対してマスクす ることが可能 31 @Bean public SanitizingFunction sanitizingFunction() { return new SanitizingFunction() { @Override public SanitizableData apply(SanitizableData data) { if (data.getPropertySource().getName().contains("secret.properties")) { return data.withValue("******"); } else { return data; } } }; } 秘密情報を保持した取得元のプロパティを すべてマスクできる
  32. 32. 新しく追加された機能 • SameSiteクッキーの設定が可能 • Actuatorで秘密情報をサニタイズするIFが追加され た • @AutoConfigureMockMvcでWebTestClientが 利用可能 • infoエンドポイントでJava実行環境の情報を取得可 能 • 起動時間のメトリクスが取得可能 32
  33. 33. @AutoConfigureMockMvcでWebTestClientが利用可能に • これまでのWebのテスト 33 @WebMvcTest(controllers = FooController.class) public class FooControllerTest { @Autowired private MockMvc mockMvc; @Test public void foo() throws Exception { mockMvc.perform(get("/foo")) .andExpect(status().isOk()); } } @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class FooIntegrationTest { @Autowired private TestRestTemplate restTemplate; @Test public void foo() { ResponseEntity<String> entity = restTemplate.getForEntity("/foo", String.class); assertThat(entity.getStatusCode()) .isEqualTo(HttpStatus.OK); } } テストメソッドの書き方が 変わってしまう(開発者の 学習コストが増える) 【Controllerの単体テスト】 【APサーバ起動した結合テスト】
  34. 34. @AutoConfigureMockMvcでWebTestClientが利用可能に 34 @WebMvcTest(controllers = FooController.class) public class FooControllerTest { @Autowired private WebTestClient client; @Test public void foo() { client.get().uri("/foo").exchange() .expectStatus().isOk(); } } @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class FooIntegrationTest { @Autowired private WebTestClient client; @Test public void foo() { client.get().uri("/foo").exchange() .expectStatus().isOk(); } } @WebMvcTestの中の @AutoConfigureMockMvcによって WebTestClientがコンフィグレーションされる テストメソッドを同じ書 き方で記述できる(開発 者の学習コストが減る) • 可能になった書き方 【注意】裏でWebClientが使うため 「spring-boot-starter-webflux」の依存が必要 【Controllerの単体テスト】 【APサーバ起動した結合テスト】
  35. 35. 新しく追加された機能 • SameSiteクッキーの設定が可能 • Actuatorで秘密情報をサニタイズするIFが追加され た • @AutoConfigureMockMvcでWebTestClientが利 用可能 • infoエンドポイントでJava実行環境の情報を取得可 能 • 起動時間のメトリクスが取得可能 35
  36. 36. infoエンドポイントでJava実行環境の情報を取得可能に • management.info.java.enabled=true 36 余談:FireFoxから移植された クロームのアドオン 「JSON Viewer」を使用した画 面。値が縦に揃って見やすい
  37. 37. 新しく追加された機能 • SameSiteクッキーの設定が可能 • Actuatorで秘密情報をサニタイズするIFが追加され た • @AutoConfigureMockMvcでWebTestClientが利 用可能 • infoエンドポイントでJava実行環境の情報を取得可 能 • 起動時間のメトリクスが取得可能 37
  38. 38. 起動時間のメトリクスが取得可能に • Actuatorの「/actuator/metrics」エンドポイントで以 下のメトリクスが利用可能になった – application.started.time • DIコンテナが起動した後、ApplicationRunner・ CommandLineRunnerを実行する「前」までの時間 – application.ready.time • アプリケーションが利用可能になるまでの時間 38
  39. 39. 余談:動画を見ていて思ったこ と 39
  40. 40. 余談:Spring initializrの「EXPLORE」の活用 • 例えば「h2のライブラリを追加したいけど、アーティファクトID ってなんだっけ?」というときに便利(ネットで検索するより楽) 40 https://start.spring.io 該当箇所をコピペ
  41. 41. 余談:spring.config.importが便利そう • spring.config.importとは? – 別の場所で設定されたプロパティをインポートできるプロ パティ(バージョン2.4からの機能) • 「optional:」でオプション扱い、「file:」でファイルシス テムから読み込める(「file:」を指定しなければクラス パスから読み込む) 41 spring.config.import=foo.properties some.prop=abc application.properties foo.properties spring.config.import=optional:file:foo.properties
  42. 42. 余談:spring.config.importが便利そう • 利用のアイデア – 実行環境に用意した秘密情報のプロパティファイルを読 込んでデフォルトを上書き – 開発者がローカルで自由に記述できるプロパティファイル を読込む 42 some.secret.aaa=for_local some.secret.bbb=for_local some.secret.ccc=for_local spring.config.import=optional:file:secret.properties spring.config.import=optional:developer.properties application.properties some.prop=・・・ ローカルのdeveloper.properties .gitignoreなどでSCMに登 録しないようにする some.secret.aaa=aaa123 some.secret.bbb=bbb123 some.secret.ccc=ccc123 本番環境のsecret.properties application.properties
  43. 43. 余談:utilパッケージのXxxUtilsクラスが便利そう • StringUtilsクラス – capitalizeメソッド • 文字列の先頭を大文字にする – uncapitalizeメソッド • 文字列の先頭を小文字にする • ReflectionUtilsクラス – findMethodメソッド • 指定したClassとメソッド名でMethodオブジェクトを返 す。親クラスも辿ってくれる 43
  44. 44. 余談:XxxUtilsクラスはabstractになってる 44 • インスタンス化を防ぐためと思われる
  45. 45. 45 ご清聴ありがとうございました
  46. 46. 46 ライセンスについて • JSUGマスコットアイコン(本スライド左下)が残されている場合に限り、本作品(またそれを元にした派生 作品)の複製・頒布・表示・上演を認めます。 • 非商用目的に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認めます。 • 本作品のライセンスを遵守する限り、派生作品を頒布することを許可します。

×