Spring4 - DI (依頼注入)サンプル
SpringのDI(Dependency Inject - 外部注入)を試してみよう。
Springはインタフェース指向のプログラミングを推奨する。よって規範と実装を分離し疎結合を実現する。
1. 人とペンのインタフェースを定義する
package app; public interface Person { public void userPen(); // ペンを使う }
package app; public interface Pen { public String write(); // 書く }
2. 日本人と赤ペンと青ペンクラスを定義する
package app.impl; import app.Pen; import app.Person; public class Japanese implements Person{ private Pen pen; public void setPen(Pen pen) { this.pen = pen; } @Override public void userPen() { System.out.println(pen.write()); } }
package app.impl; import app.Pen; public class BluePen implements Pen{ @Override public String write() { return "青文字を書きました"; } }
package app.impl; import app.Pen; import app.Person; public class Japanese implements Person{ private Pen pen; public void setPen(Pen pen) { this.pen = pen; } @Override public void userPen() { System.out.println(pen.write()); } }
3. beans.xmlを定義する
<?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"> <!-- ペンを持たせる --> <property name="pen" ref="redPen"/> </bean> <!-- 赤ペンを定義 --> <bean id="redPen" class="app.impl.RedPen"/> <!-- 青ペンを定義 --> <bean id="bluePen" class="app.impl.BluePen"/> </beans>
4. テストクラス
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.userPen(); } }
赤文字を書きました
5.DIのメリットを試す
beans.xmlを変更し、人に赤ペンではなく青ペンを持たせてみる。
<!-- Bean定義 --> <bean id="person" class="app.impl.Japanese"> <!-- ペンを持たせる --> <property name="bluePen" ref="redPen"/> </bean>
再度テストクラスを実行する
青文字を書きました