IoCとDI
IoC(制御の反転)
制御の流れを伝統的な方式と逆に変えること。Aオブジェクトの中にB、Cオブジェクトがあるとしましょう。
- 伝統的な方式は開発者がAオブジェクト内にB、Cオブジェクトを直接作る方式
- IoCは、Aオブジェクトでsetterを使用して外部からB、Cオブジェクトを生成して注入させる方式。(DI)
→プログラムの流れを開発者が制御せず、プログラム、正確に言えばSpring containerが管理することで、開発者は複雑なプログラムの流れをSpring containerに任せ、ロジックにすることに集中して作業の効率を高めることができる。
DI(依存性の注入、依存オブジェクト注入)
使用するオブジェクトを直接生成するのではなく、Beanの情報を元にContainerが自動的に注入してくれることで、クラス間の分離が行われ、再利用性の高いコードとなる。
依存オブジェクトの自動注入(Automatic Dependency Injection)
依存オブジェクトの自動注入は、Spring containerが自動的に依存オブジェクトを探し、そのオブジェクトに必要な依存を注入することである。
依存オブジェクトの注入方法には@Autowired、@Resource、および@Injectなどのアノテーションがあるが、オブジェクトを探し出す方法が異なる。
-
@Autowired
Springでサポートされているアノテーションで、注入しようとするオブジェクトのタイプが一致するBeanを確認、オブジェクトを自動的に注入します。タイプが存在しない場合は、@Autowiredにある属性名が一致するBeanをContainerで探す。それでもなかった場合は @Qualifier アノテーションの有無を探し、そのアノテーションが付いた属性に依存性を注入する。 -
@Resource
Javaでサポートされているアノテーションで、まず属性の名前を探す。なければタイプ、それもなければ @Qualifierアノテーション の有無を探し、そのアノテーションがついた属性に依存性を注入する。 -
@Inject
Javaでサポートされるアノテーションで、タイプの一致を基準に探し、なければ @Qualifierアノテーション、最後に名前を探して依存性を注入する。 @Injectを使用するには、mavenまたはgradleにjavaxライブラリの依存関係を追加する必要がある。 -
@Qualifierとは
先ほど3つのアノテーションは順番は違うがみんなタイプが一致するBeanを検索するとのことだったが、もし、同じタイプを持つBeanオブジェクトが2つ以上ある場合はどうなるか。注入対象が1つでなければならないが、2つ以上のBeanが存在するせいで注入するときに使用するオブジェクトを選択できないため、Exceptionというエラーが発生することになる。この問題を解決するために使用するのが@Qualifierアノテーション。@QualifierはBeanを指定することができる。
@Autowired | @Resource | @Inject | |
---|---|---|---|
使用 | Spring | Java | Java |
検索(適用) | Type→Name→@Qualifier | Name→Type→@Qualifier | Type→@Qualifier→Name |