yuusuke-roughの日記

Java,SpringBoot,趣味等

循環参照 in Spring Boot

はじめに

中間テーブル実装に伴い、アカウント削除に必要な機能を加えてました。

元々、アカウント側とルーム側で分けてサービス層を作っており、ルーム側はアカウント側をインタフェースインジェクションで参照しておりました。

 

そのため、アカウント側からルーム側を参照するようにしたところ

The dependencies of some of the beans in the application context form a cycle:

 …というエラーでました。

 

内容

 

interface CallUserService

UserService 

interface CallDiscussionService

DiscussionService

 

にてUserServiceがCallDiscussionServiceを、DiscussionServiceがCallUserServiceをインジェクションしているという構成だった。

 

ダメなのはわかったけれど、DIについてやはり分からないので調べた。

 

循環参照。
https://qiita.com/daker2016/items/598a86e478334c1193e3
コンストラクターでInjectionの場合、循環参照は解決できなくて、代わりに、SetterのInjectionで変更が必要となります。


違いは何だろう。
今まで使用してきた@Autowiredとはインスタンス化ではないのか?
そもそもDIとは?

https://qiita.com/ritukiii/items/de30b2d944109521298f
>「Dependency」(依存性と訳していた)は、「オブジェクト」です。
つまり、DIとは、「依存性の注入」じゃなくて、「オブジェクトの注入」だった訳ですね。

インスタンスをnewする事の問題点の話もあった。
https://qiita.com/haseesah/items/32ad604c15328e91fb75
>「あるモジュールが別のモジュールの内部動作によって変化したり依存したりする = 依存関係にあるモジュールの仕様を変更した場合、モジュールの内容が壊れる可能性が大きい」
実際にJava言語などで依存性が高い構成とは
・あるクラスのメソッド内で別のクラスのインスタンスをnewして生成している
・あるクラスのメソッドの引数として他のクラスのインスタンスを使用している
といったものが挙げられます。

https://qiita.com/kazuki43zoo/items/7a0e96573e930ac934ed

「DIの考え方を取り入れてプログラムを書く」にて、
オブジェクトを用いたインスタンス生成を行っている。
BクラスのメソッドをAクラスから呼びだせるようにしている。

>AクラスにDIの考え方を取り入れたことで、Aクラスの中でBクラスのオブジェクトを生成する処理がなくなりました。このような構成にすることで、AクラスはBクラスに加えてBクラスの子クラスのオブジェクトを使って処理を実行することができるようになります。

Wikiでは
>DIは制御の反転の一種で、オブジェクトの作成と利用について関心の分離を行い、疎結合なプログラムを実現することを目的としている。

そして、3つのインジェクションがあるとの事。

>インタフェース注入
注入用のインタフェースを定義して注入を行う方法
setter 注入
setter メソッドを定義して注入を行う方法
コンストラクタ注入
コンストラクタを定義して注入を行う方法

 

もし、この両方を使用する場合は別の層を作る必要があるのだろうか。

わかりません。