SlideShare a Scribd company logo
1
Springを何となく使ってる人が
抑えるべきポイント
2016/10/05
日本Springユーザ会
土岐 孝平
自己紹介
• 土岐 孝平
• Springを使用したシステム開発の支援
• JavaやSpringの研修の講師
• 書籍の執筆
2
発表の概要
• Springを言われた通り何となく使っていませんか?
– 上手く動かないときの対応ができない
– 応用が利かない
– 面白くない
• 主要なポイントを押さえて、開発を面白くしましょう
3
主要なポイント
• Beanのコンフィグレーション
– コンフィグレーション方法の種類と使い分け
• DI・AOP
– 使いどころ
– 同じオブジェクトが使われている
– インタフェースは必須じゃない
• データアクセス
– コネクション・トランザクション周りの仕組み
• Spring MVC
– 画面周りの処理の流れ
• Spring Security
– 認証・認可の仕組み
• テスト
– サーバを起動しなくてもBeanをテストできる
• Spring Boot
– Spring Bootが行っていること
4
コンフィグレーションの方法
• コンフィグレーションの方法は3種類から選べます
– XML
– アノテーション
– JavaConfig
5
Beanのコンフィグレーションのコンフィグレーションのコンフィグレーションのコンフィグレーション
DIコンテナコンテナコンテナコンテナ
:Foo
結果結果結果結果は同じは同じは同じは同じ
※ DIコンテナが
管理するオブジェクトのことを
Beanという
それぞれの特徴
メリット デメリット
XML
・プログラムとBean定義が分離、
一元的に記述(環境ごとに定義の
切替が容易)
・定義を変えても再ビルドが不要
(※)
・Beanが増えるとメンテが大変(リ
ファクタリングとか)
アノテー
ション
・記述が楽
・プログラムとBean定義が混在、
Bean定義が分散(定義の切替が困
難)
Java
Config
・プログラムとBean定義が分離、
一元的に記述(環境ごとに定義の
切替が容易)
・タイプセーフ
・Beanが増えるとメンテが大変(リ
ファクタリングは楽)
6
Beanのコンフィグレーションのコンフィグレーションのコンフィグレーションのコンフィグレーション
※実際には、本番環境でXMLだけ変えてそのまま動かすことは危険なのと、VCSのXML
と乖離するため、結局はVCSにコミットしてビルドしてテストした後にデプロイするはず
一般的と思われる使い分け
• 業務個別のBean(Controller、Service、Dao)はアノテーション
– Beanの数が増えてもメンテナンスが楽
• 裏方のBeanはXMLもしくはJavaConfig
– 環境ごとにBean定義を用意&一元化できて切替が容易
– サードパーティのクラスのBeanが多い
7
:Controller :Service :Dao
:Transaction
Manager
:DataSource
:View
Resolver
本番用 テスト用
業務個別
裏方 インジェクション インジェクション
Beanのコンフィグレーションのコンフィグレーションのコンフィグレーションのコンフィグレーション
:Transaction
Manager
:DataSource
:View
Resolver
DI・AOPの使いどころ
• DI
– 作成するクラスすべてをBeanで管理する訳ではない
– Controller、Service、Daoは、BeanにしてDIで紐づける
• レイヤーの間で処理を挟み込んだり、依存オブジェクトの切り替えを容易にする
– 処理の度にオブジェクトが生成され個別のフィールド値を設定するEntityやDTOは
Beanにしない
• AOP
– レイヤーの間にAOPで共通処理を挟み込む
• BeanにしかAOPできないという事情もある
– 業務的な処理は基本的にAOPは使わない
8
:Controller :Service :Dao
:DTO :Entity
アプリで
生成
DI・・・・AOP
AOPの処理
同じオブジェクトが使われている
9
• リクエストの度にController・Service・Daoのオブジェクトが作成される訳
では無い
– メモリの浪費が防げる。リクエスト間でデータ共有が可能(キャッシュなど)
– スレッドセーフにする必要がある
:FooController :FooService :FooDaoリクエストB
リクエストA
リクエストB
リクエストC
DI・・・・AOP
:FooController :FooService :FooDao
:FooController :FooService :FooDao
:FooController :FooService :FooDao
インタフェースは必須じゃない
• インタフェースを介さなくてもDIは可能
– AOPも可能
• 用途の例
– 各レイヤーの中の補助的なBean
10
Fooクラス Barクラス
DIコンテナ
Barオブジェクトを生成Fooオブジェクトを生成して、
Barオブジェクトをインジェクション
Controller Service Dao
Service
Helper
Controller
Helper
DI・・・・AOP
コネクション・
トランザクション周りの仕組み
• コネクションの取得・解放、トランザクションの開始・終了はSpringが行う
– アプリで上記のコードは出てこない
– コネクションを引数で渡さなくてよい
11
foo
:Controller :Proxy :Service :Dao
:データアク
セス機能
foo
bar
baz
SQL
ThreadLocal
:Connection
connect、、、、begin
commit、、、、close
データアクセスデータアクセスデータアクセスデータアクセス
画面周りの処理の流れ
12
Controller
Model
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
ブラウザ
①
②
③ ④
⑤
⑥
⑦
⑧⑨
Controllerを
特定
引数の値を
用意
Viewの形式・
ファイルを特定
全体の処理
を制御
• HttpServletを継承したDispacherServletが全体の
処理を制御している
Spring MVC
認証・認可の仕組み
• 認証と、URLの認可はServletFilterで行われている
– DispacherServletに依存していない(Spring MVCに依存しない)
• 認可の主な対象は、URL・メソッド・画面描画の3種類
13
@PreAuthorize("hasRole('ROLE_AD
MIN')")
public void foo(){
・・・
}
認証認証認証認証のServletFilter
<authorize
access="hasRole('ROLE_ADMIN')">
・・・
</authorize>
メソッドの認可認可認可認可の
Proxy
画面描画の認可認可認可認可の
カスタムタグ
HttpSession/ThreadLocal
SecurityContext
ユーザ 権限
URLの認可認可認可認可の
ServletFilter
Spring Security
<intercept-url pattern="/admin/**"
access="hasRole('ROLE_ADMIN')"/>
・・・
サーバを起動しなくてもBeanをテストできる
• Springのテストサポート機能を使うと便利
14
・記述が簡潔・記述が簡潔・記述が簡潔・記述が簡潔
・さまざまな便利機能が利用できる・さまざまな便利機能が利用できる・さまざまな便利機能が利用できる・さまざまな便利機能が利用できる
DIコンテナのキャッシュコンテナのキャッシュコンテナのキャッシュコンテナのキャッシュ
テストメソッドのトランザクション制御テストメソッドのトランザクション制御テストメソッドのトランザクション制御テストメソッドのトランザクション制御
・・・・・・・・・・・・
Spring Test
Spring Bootが行っていること
• 必要なJarファイルのダウンロードや、裏方のBeanのコンフィグレーション、組込
サーバ(Tomcat)の実行を自動で行ってくれる
• 業務個別のBeanのプログラムの作りは、Bootを使っても使わなくても変わらない
• 組込じゃないTomcatにデプロイすることも可能
15
:Controller :Service :Dao
裏方のBean
:Tomcat
組込サーバ
必要なJarファイル
Spring
のjar
JPAの
jar
JUnit
のjar ・・・
Bootが用意
業務個別のBean
・・・
Spring Boot
Tomcat
のjar
:Transaction
Manager
:DataSource
:View
Resolver
接続先などの
プロパティ
さいごに
• 書籍を購入して、スライドの内容を再確認しましょう
• おすすめの書籍
16
[改訂新版改訂新版改訂新版改訂新版]Spring入門入門入門入門 Spring徹底入門徹底入門徹底入門徹底入門
17
ご清聴ありがとうございました
18
ライセンスについて
• JSUGマスコットアイコン(本スライド左下)が残されている場合に限り、本作品(またそれを元にした派生
作品)の複製・頒布・表示・上演を認めます。
• 非商用目的に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認めます。
• 本作品のライセンスを遵守する限り、派生作品を頒布することを許可します。

More Related Content

Springを何となく使ってる人が抑えるべきポイント