SlideShare a Scribd company logo
2
Most read
7
Most read
10
Most read
初心者だった私が
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

PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
画像認識モデルを作るための鉄板レシピ
PDF
例外設計における大罪
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
イミュータブルデータモデルの極意
PDF
ドメイン駆動設計のための Spring の上手な使い方
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
怖くないSpring Bootのオートコンフィグレーション
画像認識モデルを作るための鉄板レシピ
例外設計における大罪
マルチテナント化で知っておきたいデータベースのこと
イミュータブルデータモデルの極意
ドメイン駆動設計のための Spring の上手な使い方
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)

What's hot (20)

PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PPTX
DockerコンテナでGitを使う
PDF
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
PDF
こわくない Git
PDF
暗号技術の実装と数学
PDF
SSII2022 [TS2] 自律移動ロボットのためのロボットビジョン〜 オープンソースの自動運転ソフトAutowareを解説 〜
PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
PDF
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
PPTX
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
PDF
組織にテストを書く文化を根付かせる戦略と戦術
PDF
情報推薦システム入門:講義スライド
PDF
ディープラーニングのフレームワークと特許戦争
PDF
Tackling Complexity
PDF
Javaのログ出力: 道具と考え方
PDF
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
PPTX
initとプロセス再起動
PPTX
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
PDF
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
PDF
Test Yourself - テストを書くと何がどう変わるか
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
DockerコンテナでGitを使う
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
こわくない Git
暗号技術の実装と数学
SSII2022 [TS2] 自律移動ロボットのためのロボットビジョン〜 オープンソースの自動運転ソフトAutowareを解説 〜
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
組織にテストを書く文化を根付かせる戦略と戦術
情報推薦システム入門:講義スライド
ディープラーニングのフレームワークと特許戦争
Tackling Complexity
Javaのログ出力: 道具と考え方
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
initとプロセス再起動
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
Test Yourself - テストを書くと何がどう変わるか
Ad

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

Editor's Notes

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