SlideShare a Scribd company logo
1 of 16
初心者だった私が
Spring(DIコンテナ)を
分かるまで
自己紹介
• 田村 英雅 (たむら ひでのり)
• 合同会社GuildHubの代表社員
• 仕事歴は18年くらい、Spring歴は10年弱、JSUG歴は数ヶ月
• 最近の業務は、Springを使ったプロジェクトでQA(Quaity
Assurance)をしています
発表の内容
• 初心者だった頃(Spring 2.0.0の頃)、 Reflectionを知って、
Spring(DI コンテナ)を理解できるようになりました
• 今回はその体験を以下の順序で分かりやすく解説します
• 初心者だったころにつまずいた所
• DIコンテナが理解できたときの流れ
• 今のSpring
初心者だったころにつまづいた所
• Spring(DIコンテナ)が、どうやってServiceImplやRepositoryImpl をインス
タンス化しているのか分からない
DI Container
XML Bean定義ファイル
Controller AServiceImpl XRepositoryImpl DB
初心者でも理解しやすい「newだけ」のWebアプリから解説スタート
newだけのWebアプリ
Controller AService XRepository
new
DB
• ServiceとRepositoryが密結合
• Serviceのメソッドが呼ばれる度に、毎回新しいRepositoryインスタン
スを生成する
public class AService {
public X method() {
XRepository xRepository = new XRepository();
return xRepository.find();
}
...
newだけの課題と対応
• 密結合だと、テストが大変だったり、変更の影響が(依存関係を
伝播して)大きくなりやすく、機能拡張もしにくい
⇒ インタフェースを導入し、Factoryクラス(Factory methodパターン
みたいな奴)を使う
Factoryクラスを使ったWebアプリ
• インタフェースとFactoryクラスを導入する
Factory
Controlle
r
AServiceImp
l
XRepositoryIm
pl DB
簡単なFactoryクラスと利用方法
public class Factory {
public static XRepository create() {
return new XRepositoryImpl();
}
...
public class AServiceImpl implements AService {
public X method() {
XRepository xRepository = Fctory.create();
return xRepository.find();
}
...
Factoryクラスの課題と対応
• プロジェクトが変わる度に、Factoryクラスを毎回作るのは大変
• 設定ファイルからインスタンス化対象を読み取り、インスタンス化したい
• クラスの置き換え(依存関係の変更)には実装の変更が必要
• 設定ファイルから依存関係を読み取り、インスタンス化したクラスに注入
したい
Reflectionを使えばこれが実現できる!
Reflectionのかんたん解説
• クラス名(つまり文字列)から、インスタンスの生成ができる
public class Factory {
public static Object create(String className) throws Exception {
Class<?> clazz = Class.forName(className);
Object o = clazz.getDeclaredConstructor().newInstance();
return o;
}
...
public class AServiceImpl implements AService {
public X method() {
XRepository xRepository = Fctory.create("demo.XRepositoryImpl");
return xRepository.find();
}
...
進化したFactoryクラス
• ここまでの話を踏まえて、アプリの起動時にFactoryがクラス名を記述
されたプロパティファイルを読み込んでnewし、そのインスタンスを
setメソッドでセットすればAServiceImplなどから、依存するクラス名
(例えば、"demo.XRepositoryImpl")も消すことができる
プロパティファイル
Factory
Controller AServiceImpl XRepositoryImpl DB
なぁんだ!
それってDIコンテナじゃないか!!
Spring DIコンテナ
• インスタンス化するクラスと、クラス間の依存関係は、設定ファイル
に定義できる
• XML Bean定義ファイル(私が最初に触ったのは、こっちだった
ので)
• DIコンテナは、アプリ起動時に、Bean定義ファイルの通りに、クラス
のインスタンスを生成し、依存関係を注入する
DI Container
XML Bean定義ファイル
Controller AServiceImpl XRepositoryImpl DB
XML Bean定義ファイルを使った実装例
<beans ...>
<bean id="aService" class="demo.AServiceImpl">
<property name=xRepository" ref="xRepository" />
</bean>
<bean id="xRepository" class="demo.XRepositoryImpl" />
</beans>
public class AServiceImpl implements AService {
private Xrepository xRepository;
public void setXRepository(XRepository xrepository) {
this.xRepository = xRepository;
}
public X method() {
return xrepository.find();
}
...
現在
• アノテーションを使って、Spring Bootで簡単!
• XML Bean定義ファイルも不要
@Controller @Service @Repository
@Service
public class AServiceImpl implements AService {
@Autowired
private Xrepository xRepository;
public X method() {
return xRepository.find();
}
...
@Repository
public class XRepositoryImpl implements XRepository {
public X find() {
...
}
...
DI Container
Controller AServiceImpl XRepositoryImpl DB
最後に
• 勉強会で登壇することになって
• 人に説明するために、改めて復習することが必要になった
• 資料の作り方や、自分の技術力不足を痛感することがあった
• 結果として、自分の勉強になった!
• 登壇してみて
• リアルタイムで今の気持ちを語ります
• 今後の抱負
• また勉強会に参加して、登壇したい(それが凄く勉強になる)!!

More Related Content

What's hot

設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 

What's hot (20)

C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
スタートアップの 3 分ピッチテンプレート
スタートアップの 3 分ピッチテンプレートスタートアップの 3 分ピッチテンプレート
スタートアップの 3 分ピッチテンプレート
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Design Sprint と Lean UX: 顧客からの学び方
Design Sprint と Lean UX: 顧客からの学び方Design Sprint と Lean UX: 顧客からの学び方
Design Sprint と Lean UX: 顧客からの学び方
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
はじめようArcore (修正版)
はじめようArcore (修正版)はじめようArcore (修正版)
はじめようArcore (修正版)
 
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングSpring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
 
アーキテクチャとアジャイルプロジェクトをまともに進めるための両輪について-DevLOVE関西 #DevKan
アーキテクチャとアジャイルプロジェクトをまともに進めるための両輪について-DevLOVE関西 #DevKan アーキテクチャとアジャイルプロジェクトをまともに進めるための両輪について-DevLOVE関西 #DevKan
アーキテクチャとアジャイルプロジェクトをまともに進めるための両輪について-DevLOVE関西 #DevKan
 

初心者だった私がSpring(DIコンテナ)を分かるまで

Editor's Notes

  1. 基盤チームがインスタンス化を担うFactoryを作る 開発チームがFactoryを使って実装する