liguofeng29’s blog

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

Spring4 - DI種類

SpringのDI方式は下記2種類がある

  1. コンストラクターによるDI
  2. 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がないため、後で変更される恐れがない