Spring4 - DI種類
SpringのDI方式は下記2種類がある
- コンストラクターによるDI
- setterによるDI
package app.impl; import app.Pen; import app.Person; public class Japanese implements Person{ private int age; // 年齢 private String name; // 名前 private Pen pen; public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } public void setPen(Pen pen) { this.pen = pen; } public Japanese(String name, int age) { this.name = name; this.age = age; } public void info() { System.out.println("名前 : " + this.name); System.out.println("年齢 : " + this.age); } @Override public void userPen() { System.out.println(pen.write()); } }
<?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- Bean定義 --> <bean id="person" class="app.impl.Japanese"> <!-- コンストラクタによるDI --> <constructor-arg value="佐藤"></constructor-arg> <constructor-arg value="20"></constructor-arg> <!-- setterによるDI --> <property name="pen" ref="bluePen"/> </bean> <!-- 赤ペンを定義 --> <bean id="redPen" class="app.impl.RedPen"/> <!-- 青ペンを定義 --> <bean id="bluePen" class="app.impl.BluePen"/> </beans>
テストクラス
package app; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { public static void main(String[] args) { // Springコンテナー生成 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); // Bean取得 Person p = context.getBean("person", Person.class); // Person p = (Person) context.getBean("person"); // Person p = context.getBean(Person.class); p.info(); } }
名前 : 佐藤 年齢 : 20
setterのメリット
- 直観的であり、比較的に理解しやすい
- 複雑なDIの場合、コンストラクタの場合性能面、読み取り性が落ちる
コンストラクターによるDIのメリット
- コンストラクタの中でDIの順序を決められる
- 依頼関係が変更されない場合、コンストラクタDIが良い。setterがないため、後で変更される恐れがない