spring4とspring bootで作る次世代springアプリケーション #jjug #jsug

Post on 10-May-2015

20.534 Views

Category:

Technology

11 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Spring 4とSpring Bootで作る 次世代Springアプリケーション

JJUG ナイトセミナー 2014/01/21

槙 俊明 (@making)

自己紹介• @making

• 大手SIerでR&D

• JJUG幹事

• 金魚本(http://amzn.to/JavaEE6)を一部翻訳

• http://blog.ik.am

• 公私ともにSpringユーザー http://terasoluna.org

自己紹介• @making

• 大手SIerでR&D

• JJUG幹事

• 金魚本(http://amzn.to/JavaEE6)を一部翻訳

• http://blog.ik.am

• 公私ともにSpringユーザー http://terasoluna.org

昨年末にSpringのガイドライン公開しました

[宣伝] はじめてのBootstrap• なぜか畑違いのBootstrap3入門の本書きました

• 初心者向けです

• http://bit.ly/hajiboo

会場を貸してくださったOracleさんありがとうございます!

Java EEも好きです!

http://www.slideshare.net/makingx

今日伝えたいこと

• Spring Frameworkは楽しい!進化し続けている!

• Java EEとともにJavaフレームワークの選択肢の1つとして考えてほしい

今日のコンテンツ

• Spring 4の紹介 (15分)

• Spring Bootの紹介 (30分)

今日のデモ• http://bit.ly/spring-boot-demo

今日のデモ• http://bit.ly/spring-boot-demo

ダウンロードして即実行可能!

http://spring.io

今日のスコープ

今日のスコープ

4.0.0.RELEASEリリース済み もうすぐ4.0.1.RELEASEリリース(Bug Fix版)

今日のスコープ

0.5.0.M7リリース 絶賛開発中

4.0.0.RELEASEリリース済み もうすぐ4.0.1.RELEASEリリース(Bug Fix版)

Spring 4

Spring 4の新機能• Java 8

• Java EE 7

• WebSocket, SockJS, and STOMP Messaging

Java 8サポート• Lamada式サポート

• JSR-310サポート(@DateTimeFormat)

• Repeatableアノテーションサポート

Lambdaサポート

Lambdaサポート

Lambdaサポート

SpringにはTemplateパターン+コールバックな機能が多いのでラムダ式の恩恵が大きい!

Lambdaサポート

SpringにはTemplateパターン+コールバックな機能が多いのでラムダ式の恩恵が大きい!

method referenceもOK

JSR-310サポート

Repeatable Annotation

Repeatable Annotation

JDK6+

JDK8

さらなるRESTサポート

• @RestController

• AsyncRestTemplate

@RestController

No @ResponseBody

AsyncRestTemplate

AsyncRestTemplate

AsyncRestTemplate

Java EE 7サポート

• JMS 2.0

• JTA 1.2

• JPA 2.1

• Bean Validation 1.1

• JSR-236 Concurrency Utilities

JTA 1.2サポート• @javax.transaction.Transactionalで宣言的トランザクション管理

!

!

!

JTA 1.2サポート• @javax.transaction.Transactionalで宣言的トランザクション管理

!

!

!

Java標準アノテーションのみ!

• org.springframework.scheduling.concurrent.

• ConcurrentTaskExecutor

• DefaultManagedTaskExecutor

• javax.enterprise.concurrent.ManagedExecutorServiceを自動で検知

JSR-236 Concurrency Utilitiesサポート

JSR-349 Bean Validation 1.1 サポート

• メソッドバリデーション

• @ConvertGroupでバリデーションルールのグループ化

JSR-349 Bean Validation 1.1 サポート

• メソッドバリデーション

• @ConvertGroupでバリデーションルールのグループ化

実はSpring3 (JSR-303対応版)から メソッドバリデーション

グループ対応の独自機構はあった

WebSocket対応• JSR-356サポート

• Jetty, Tomcatの独自実装もサポート

• レガシーブラウザ向けにSockJSサポート

JJUG CCC 2013 Fallの資料参照

http://www.slideshare.net/makingx/spring-framework-2013-jjugccc-cccr17

STOMPサポート• ハイレベルメッセージングプロトコル

• TCPに対するHTTPみたいなプロトコル

• @ControllerでSpring MVC likeにWebSocketプログラミングができる

デモ

http://bit.ly/stomp-demo

デモ

接続

http://bit.ly/stomp-demo

デモ

http://bit.ly/stomp-demo

デモ

いいね!

http://bit.ly/stomp-demo

デモ

http://bit.ly/stomp-demo

CONNECTで接続

CONNECTで接続

SUBSCRIBEで特定の宛先メッセージを購読

CONNECTで接続

SUBSCRIBEで特定の宛先メッセージを購読

SENDでアプリケーションの宛先へメッセージを送信

CONNECTで接続

SUBSCRIBEで特定の宛先メッセージを購読

SENDでアプリケーションの宛先へメッセージを送信

購読したメッセージが届く

Controllerクラス

Controllerクラス

アプリケーションへの宛先

Controllerクラス

アプリケーションへの宛先

メッセージ送り先

Controllerクラス

アプリケーションへの宛先

メッセージ送り先

JSONにシリアライズされて購読している全クライアントに送

信される

JavaConfigクラス

JavaConfigクラス

アプリケーションへの 送信先のprefix

• 要stomp.js

クライアント

• 要stomp.js

クライアント

CONNECT

クライアント

クライアントSUBSCRIBE

クライアントSUBSCRIBE

受信したら実行される コールバック

クライアント

クライアント

メッセージ送信

変更のあるAPI• http://docs.spring.io/spring-framework/docs/

3.2.4.RELEASE_to_4.0.0.RELEASE/

変更のあるAPI• http://docs.spring.io/spring-framework/docs/

3.2.4.RELEASE_to_4.0.0.RELEASE/

遂にStruts, iBatisサポートが削除されました!

併せて読みたい

http://rstoyanchev.github.io/webinar-websocket-spring

http://spring.io/guides/gs/messaging-stomp-websocket/

Spring Boot

Spring Bootとは?

• 一言でいうと

• Springアプリケーションを迅速に開発するための仕組み

Spring Bootの背景

• DI x AOPで注目され、重厚なJ2EEのアンチテーゼとして2004年に登場

!

!

Springのサブプトジェクト群

Web

Core

DataAccess Batch Enterprise Integration

Security

IDE

RAD Starter

Social

Spring MVC

Spring WebFlow

Spring Mobile

Spring Roo

Spring Data JPA

Spring DataMongoDB

Spring Boot

Spring Tool Suite (STS)

Spring SocialTwitter

Spring SocialFacebook

Spring SocialGithub

Big Data

Spring Data Rest

Spring Batch Spring Integration

Spring DI Spring AOP

Spring Security

Spring SecurityOAuth

Spring XD

Spring TX

Spring Hadoop

Springのサブプトジェクト群

Web

Core

DataAccess Batch Enterprise Integration

Security

IDE

RAD Starter

Social

Spring MVC

Spring WebFlow

Spring Mobile

Spring Roo

Spring Data JPA

Spring DataMongoDB

Spring Boot

Spring Tool Suite (STS)

Spring SocialTwitter

Spring SocialFacebook

Spring SocialGithub

Big Data

Spring Data Rest

Spring Batch Spring Integration

Spring DI Spring AOP

Spring Security

Spring SecurityOAuth

Spring XD

Spring TX

Spring Hadoop

大杉!

サブプロジェクトが どんどん増えJava EEより肥大化・・

そこで生まれたSpring Boot

Spring Bootの特徴• サブプロジェクトの複雑な依存関係がまとめられ、

pom.xml or build.gradleがシンプルになる。

• あらかじめ各種設定済みでXMLが不要になる。

• Production Readyな非機能面のサポート

• ”The Twelve-Factor App”で述べられるようなモダンなアプリケーションを作成できる。

まずは試す• pom.xmlに以下を追加

まずは試す• dependencyはこれだけ!

まずは試す• プラグイン追加

まずは試す• 正式リリースまではRepositoryを指定

まずは試す

• pom.xml 全体

• https://gist.github.com/making/8487605

• Gradleでもちろんできる

まずは試す• エントリポイント作成

まずは試す• エントリポイント作成

自動設定を有効化

まずは試す• Controller作成

まずは試す• 実行

$ mvn packge $ java -jar target/demo-0.0.1-SNAPSHOT.jar

まずは試す• 実行

$ mvn packge $ java -jar target/demo-0.0.1-SNAPSHOT.jar

jar!

Springのバナー表示

Springのバナー表示

色付きのログ出力

Springのバナー表示

色付きのログ出力

組み込みTomcat起動

Springのバナー表示

色付きのログ出力

組み込みTomcat起動

必要なファイルはこれだけ!

必要なファイルはこれだけ!

XMLがない! (logback.xmlも

web.xmlも)

Logback

Jackson

Tomcat

SLF4J

Spring Boot

Spring 4

mainメソッド実行でももちろんOK

Spring Tool Suite 3.4を使うと楽

Spring Tool Suite 3.4を使うと楽

Spring Tool Suite 3.4を使うと楽

Spring Tool Suite 3.4を使うと楽

[参考] DropWizard• http://dropwizard.codahale.com/

http://www.thoughtworks.com/radar

http://www.thoughtworks.com/radar

注目のフレームワーク

Spring BootはDrop WizardのSpring版! (しかもSpring謹製)

Spring Bootの主なスタック

Tomcat/Jetty

Sprin

g M

VC

Jack

son Sp

ring

Dat

a JP

A

Thym

eLea

f

Sprin

g Se

curit

y

Hib

erna

te

Spring

[参考] DropWizardの主なスタック

JAX-

RS(J

erse

y)

Jack

son

Free

Mak

er/

Mus

tach

e

独自

Auth

entic

atio

n?

Hib

erna

teJD

BI

Jetty

Guice

様々な自動設定群• spring-boot-autoconfigureに自動設定が組み込まれている

様々な自動設定群• org.springframework.boo

t.autoconfigureパッケージをチェック

様々な自動設定群• @EnableAutoConfigurationで読み込まれる設定は

META-INF/spring.factoriesに列挙されている。追加可能

自動設定の仕組み• @Conditional

自動設定の仕組み• @Conditional

対象のクラスがクラスパス上に存在したら有効

自動設定の仕組み• @Conditional

対象のクラスがクラスパス上に存在したら有効

対象のクラスのBeanがDIコンテナ上に存在しなかったら有効

自動設定の仕組み• @Conditional

対象のクラスがクラスパス上に存在したら有効

対象のクラスのBeanがDIコンテナ上に存在しなかったら有効

<mvc:annotaion-driven />と同じ

自動設定の仕組み• @Conditional

対象のクラスがクラスパス上に存在したら有効

対象のクラスのBeanがDIコンテナ上に存在しなかったら有効

<mvc:annotaion-driven />と同じ

プロパティファイルで変更可能

例: Tomcatのデータソース自動生成の流れ

• META-INF/spring.factoriesにDataSourceAutoConfigurationが定義されている。

例: Tomcatのデータソース自動生成の流れ

例: Tomcatのデータソース自動生成の流れ

EmbeddedDatabaseTypeがクラスパス上に存在したら有効 =spring-jdbc.jarが含まれていたら有効

例: Tomcatのデータソース自動生成の流れ

例: Tomcatのデータソース自動生成の流れ

(1) o.a.t.j.p.DataSourceが存在して、

例: Tomcatのデータソース自動生成の流れ

(1) o.a.t.j.p.DataSourceが存在して、

(2) javax.sql.DataSourceのBeanがDIコンテナ上に存在しなかったら

例: Tomcatのデータソース自動生成の流れ

(1) o.a.t.j.p.DataSourceが存在して、

(2) javax.sql.DataSourceのBeanがDIコンテナ上に存在しなかったら

(3) TomcatDataSourceConfigurationをimportする

例: Tomcatのデータソース自動生成の流れ

例: Tomcatのデータソース自動生成の流れ

DataSourceが生成され、DIコンテナに登録される

例: Tomcatのデータソース自動生成の流れ

例: Tomcatのデータソース自動生成の流れ

urlやusername等の設定情報はpropertieファイルからインジェクション可能

例: Tomcatのデータソース自動生成の流れ

urlやusername等の設定情報はpropertieファイルからインジェクション可能

spring.datasource.url: xxx spring.datasource.username: xxx spring.datasource.password: xxx

例: Tomcatのデータソース自動生成の流れ

例: Tomcatのデータソース自動生成の流れ

自分で定義すれば自動設定は適用されない

ドキュメントが整備されるまではソースを読んで設定内容を把握しよう

Production Readyな非機能面サポート

• spring-boot-actuatorで各種メトリクス収集やヘルスチェックのためのEndpoint提供(REST API, JMX)

• spring-boot-starter-securityでセキュリティ強化

• 開発・本番環境の設定を変更するための仕組み

• などなど・・

spring-boot-actuator• GET /metrics

• GET /health

• GET /trace

• GET /dump

• POST /shutdown

• GET /beans

• GET /env

• など・・・

GET /env•ユーザー名: demo、パスワード: demo

•http://spring-boot-demo.herokuapp.com/env

GET /dump•ユーザー名: demo、パスワード: demo

•http://spring-boot-demo.herokuapp.com/dump

GET /metrics•ユーザー名: demo、パスワード: demo

•http://spring-boot-demo.herokuapp.com/metrics

Securityサポート• Spring Securityによる認証・認可

• Audit

SSHサーバー化• spring-boot-actuatorで取得できた情報をSSHで公開

• デフォルトで2000番ポートにSSHDが起動する

$ ssh -p 2000 demo@localhost

The Twelve-Factor App• Herokuの人がまとめた、スケーラブルで継続的デプロイ可能なWebアプリ/SaaSを構築するための方法論

• http://12factor.net/

• http://twelve-factor-ja.herokuapp.com/ (日本語訳)

The Twelve-Factor App

• Spring BootやDropWizardではThe Twelve-Factor Appで述べられているノウハウがいくつか実践されている

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080aaa.war

bbb.war

ccc.war

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.war

ccc.war

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.war

ccc.war

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

/aaa

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

/aaa

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

/aaa/bbb

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

/aaa/bbb

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

/aaa/bbb/ccc

アプリケーションのデプロイ方法• 従来のデプロイ

AP Server: 8080

aaa.warbbb.warccc.war

/aaa/bbb/ccc

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa/bbb

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa/bbb

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa/bbb

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa/bbb

/ccc

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa/bbb

/ccc

• Spring BootやDropWizardのデプロイ

ccc.jar

アプリケーションのデプロイ方法

8082bbb.jar

8081aaa.jar

8080

Webアプリをプロセスとして起動

Reverse Proxy

/aaa/bbb

/ccc

Ctrl+CでGraceful Shutdown

Ctrl+CでGraceful ShutdownCtrl+Cの後に

Ctrl+CでGraceful ShutdownCtrl+Cの後に

後処理

PaaS Friendly!• Heroku

• Procfile

!

!

• Deploy

web: java $JAVA_OPTS -jar target/demo-1.0-SNAPSHOT.jar --server.port=$PORT

$ echo "java.runtime.version=1.8" > system.properties $ heroku create $ git push heroku master

“war” is over!

もちろんwar”も”作成できる

その他• ViewはThymeleafをサポート

• Property

• CLI

• Testサポート

• DBマイグレーション

• などなど!

Thymeleafサポート

Thymeleafサポート

Spring4対応中

Thymeleafサポート

Spring4対応中

JSPも使えるがあまり推奨しない

ThymeleafAutoconfiguration

classpath直下のtempaltes

Property• @ConfigurationProperties

• コマンドライン引数 > ファイル > classpathの優先順

• Bean Validationもサポート

• YAMLもサポート(snake-yaml.jarがあれば)

Property

todo.maxCount

• @ConfigurationProperties

• コマンドライン引数 > ファイル > classpathの優先順

• Bean Validationもサポート

• YAMLもサポート(snake-yaml.jarがあれば)

Property• classpath直下のapplication.properties

Property• classpath直下のapplication.properties

100

Property• ローカルファイルのapplication.properties

Property• ローカルファイルのapplication.properties

200

Property• コマンドライン引数

Property• コマンドライン引数

400

開発方法

• mainメソッド実行?

• IDEのAPサーバー連携機能?

APサーバーで実行してもOK

WTPもOK

https://spring.io/guides/gs/convert-jar-to-war/

WTPもOK

Tomcat 7.0.47+

https://spring.io/guides/gs/convert-jar-to-war/

mainメソッドを実行していたら・・・

再起動したくない!

Spring Loaded• みなさんお待ちかねのHot Reloading

• ダウンロード

• http://dist.springframework.org/release/LOADED/springloaded-1.1.4.jar

$ java -javaagent:<pathTo>/springloaded-1.1.4.jar -noverify SomeJavaClass

Spring Loaded• みなさんお待ちかねのHot Reloading

• ダウンロード

• http://dist.springframework.org/release/LOADED/springloaded-1.1.4.jar

$ java -javaagent:<pathTo>/springloaded-1.1.4.jar -noverify SomeJavaClass

Springに依存しない

修正

修正

修正

再起動いらず

【後日追記】Spring Boot Plugin

• http://projects.spring.io/spring-boot/docs/spring-boot-tools/spring-boot-maven-plugin/README.html

• mvn spring-boot:runでもアプリは起動し、src/main/resources以下はhot refreshされます。ちょっとしたThymeleafやjavascriptのrefreshに便利

Spring is fun!

あわせて読みたい

• http://www.slideshare.net/sbrannen/spring-framework-40-the-next-generation-softshake-2013

• http://presos.dsyer.com/decks/spring-boot-intro.html

• 豊富なサンプル群 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples

• チュートリアル群 https://spring.io/guides

まとめ

• Spring Frameworkは楽しい!進化し続けている!

• Java EEとともにJavaフレームワークの選択肢の1つとして考えてほしい

Spring Bootでモダンなアプリを作りましょう!

ご清聴ありがとうございました!

top related