SlideShare a Scribd company logo
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)を一部翻訳
昨年末にSpringのガイドライン

•

http://blog.ik.am

•

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

公開しました
[宣伝] はじめての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サポート

method referenceもOK

SpringにはTemplateパターン
+コールバックな機能が多いの
でラムダ式の恩恵が大きい!
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標準アノテーションのみ!
JSR-236 Concurrency Utilities
サポート
•

org.springframework.scheduling.concurrent.
•
•

•

ConcurrentTaskExecutor
DefaultManagedTaskExecutor

javax.enterprise.concurrent.ManagedExecutorService
を自動で検知
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/springframework-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
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
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のサブプトジェクト群
IDE
Spring Tool Suite (STS)
RAD

Starter

Spring Roo
Web

Spring Boot
Spring XD

Spring Data Rest

Spring WebFlow

Spring
Security

OAuth

Spring MVC

Spring
Security

Spring Mobile

Social

Big Data

Security
DataAccess

Spring Hadoop
Batch

Spring Data

MongoDB
Spring Data
JPA

Spring Batch

Enterprise
Integration

Spring
Integration

Core
Spring DI

Spring AOP

Spring TX

…

Spring Social

Github
Spring Social

Facebook
Spring Social

Twitter
Springのサブプトジェクト群
IDE
Spring Tool Suite (STS)
RAD

大杉!

Spring Roo
Web

Spring XD

Spring WebFlow

Spring
Security

OAuth

Spring MVC

Spring
Security

Spring Mobile

Spring Boot
Social

Big Data

Security

Spring Data Rest

Starter

DataAccess

Spring Hadoop
Batch

Spring Data

MongoDB
Spring Data
JPA

Spring Batch

Enterprise
Integration

Spring
Integration

Core
Spring DI

Spring AOP

Spring TX

…

Spring Social

Github
Spring Social

Facebook
Spring Social

Twitter
サブプロジェクトが
どんどん増え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!
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
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

Tomcat/Jetty

Spring MVC

ThymeLeaf

Hibernate

Spring Data JPA

Jackson

Spring Security

Spring Bootの主なスタック
Jetty

Guice

Hibernate

JAX-RS(Jersey)

Jackson

JDBI

FreeMaker/
Mustache

独自Authentication?

[参考] DropWizardの主なスタック
様々な自動設定群
•

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
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
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: 8080
aaa.war
bbb.war
ccc.war
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

bbb.war
ccc.war

aaa.war
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

bbb.war
ccc.war

aaa.war
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war

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

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war

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

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war

/bbb /aaa
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war

/bbb /aaa
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war

/ccc /bbb /aaa
アプリケーションのデプロイ方法
•

従来のデプロイ
AP Server: 8080

ccc.war

bbb.war

aaa.war

/ccc /bbb /aaa
アプリケーションのデプロイ方法
•

Spring BootやDropWizardのデプロイ

ccc.jar

bbb.jar

aaa.jar

8082

8081

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

/bbb

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

/bbb

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

/bbb

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

/ccc

/bbb

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

/ccc

/bbb

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

Spring BootやDropWizardのデプロイ

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

bbb.jar

aaa.jar

8082

8081

8080

Reverse Proxy

/ccc

/bbb

/aaa
Ctrl+CでGraceful Shutdown
Ctrl+CでGraceful Shutdown
Ctrl+Cの後に
Ctrl+CでGraceful Shutdown
Ctrl+Cの後に

後処理
PaaS Friendly!
•

Heroku
•

Procfile

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

•

Deploy

$ 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
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
classpath直下のtempaltes
Property
•

@ConfigurationProperties

•

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

•

Bean Validationもサポート

•

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

@ConfigurationProperties

•

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

•

Bean Validationもサポート

•

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

todo.maxCount
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に依存しない
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
修正
修正
修正

再起動いらず
【後日追記】Spring Boot Plugin

•

http://projects.spring.io/spring-boot/docs/spring-boottools/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/springframework-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でモダンなアプリ
を作りましょう!
ご清聴ありがとうございました!

More Related Content

Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug