Post on 10-May-2015
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さんありがとうございます!
今日伝えたいこと
• Spring Frameworkは楽しい!進化し続けている!
• Java EEとともにJavaフレームワークの選択肢の1つとして考えてほしい
今日のコンテンツ
• Spring 4の紹介 (15分)
• Spring Bootの紹介 (30分)
今日のスコープ
今日のスコープ
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プログラミングができる
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を使うと楽
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でモダンなアプリを作りましょう!
ご清聴ありがとうございました!