Spring DIコンテナ

DIコンテナとは

DI

Dependency Injection
依存性注入
依存性を外部ファイルに記述し、ソースコードの変更を少なくする事

依存性

※Car1.java
class Car1{
 ~
}
※Car2.java
class Car1{
 ~
}
※Main.java
Car1 car1 = new Car1();

Car2 car2 = new Car2();
MainクラスはCar1、Car2に依存している
※Car1→Car2へ変更する場合、ソースコードを変更する必要がある

依存性の解決

設定ファイル方式
1) 呼び出し先クラスを記述した設定ファイルを読み込むのみ
設定ファイルの内容を変えるだけで呼び出し対象クラスを変更できる
アノテーション方式
2) アノテーションを付加した呼び出し先クラスを自動読み込み
呼び出し先クラスのアノテーションを変更するだけで呼び出し対象クラスを変更できる
3) インスタンス化はフレームワーク(Spring、Spring-Boot等)が自動実行
呼び出し元ではクラス名を書かないで済む。変更に強い

設定ファイル実装例

Bean定義ファイル

※applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 <bean id="carImpl" class="com.office.yone.CarImpl1"></bean>
 <bean id="person" class="com.office.yone.Person">
  <property name="car" ref="carImpl" />
 </bean>
 ↓
 呼び出すクラスをCarImpl1→CarImpl2に変える場合
 設定ファイルのクラス名を変更する
 <bean id="carImpl" class="com.office.yone.CarImpl2"></bean>
 <bean id="person" class="com.office.yone.Person">
  <property name="car" ref="carImpl" />
 </bean>
</beans>

実行されるクラス

※Car.java
public interface Car {
 String Drive();
}

※CarImpl1.java
public class CarImpl1 implements Car {
 @Override
 public String Drive() {
  return "車種1でドライブ";
 }
}
※CarImpl2.java
public class CarImpl2 implements Car {
 @Override
 public String Drive() {
  return "車種2でドライブ";
 }
}

DIコンテナ

※Person.java
public class Person {
 private Car car;
 public void setCar(Car car){
  this.car = car;
 }
 public String getPlan(){
  return car.Drive();
 }
}

実行クラス

※DiTest.java
public class DiTest {
 public static void main(String[] args) {
  ApplicationContext context =
   new ClassPathXmlApplicationContext("applicationContext.xml");
  Person person = (Person) context.getBean("person");
  System.out.println(person.getPlan());
  Bean定義ファイル:class=CarImpl1の場合
  →車種1でドライブ
  Bean定義ファイル:class=CarImpl2の場合
  →車種2でドライブ
  ※Car1→Car2へ変更する場合、ソースコードを変更する必要がない
 }
}

アノテーション実装例

Spring Boot 7 DI処理」参照