liguofeng29’s blog

個人勉強用ブログだっす。

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>

再度テストクラスを実行する

青文字を書きました