SpringのDIコンテナについて

いまどきのJavaを使ったWEBアプリケーション開発を使いたいと思い調べたSpringの基本のメモです。

DIコンテナ

SpringのDIコンテナを使うとオブジェクトの依存関係を簡単に解決できるとのこと。アスペクト指向プログラミングの詳しいことは分からないので、これから勉強していきたいと思います。  

コードの具体例

ちなみに、Springのバージョンは4.0.4です。

src/main/hello/person.java

public class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"services.xml"});
Person john1 = (Person)ctx.getBean("person");

src/main/resources/services.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.xsd">

    <bean id="person" class="hello.Person">
        <constructor-arg index="0" value="john" />
        <constructor-arg index="1" value="11" />
    </bean>

</beans>

Personクラスのコンストラクタに"john"と"11"を設定してインスタンスを生成しています。 DIコンテナを使わないとnewでコンストラクタに引数を指定して生成しますが、DIコンテナの場合は その記載が不要です。

こんな書き方も出来ます。

Person john2 = ctx.getBean("person", Person.class);

DIコンテナのスコープ

ちなみに、SpringのDIコンテナにはスコープがあり、デフォルトはシングルトンです。なので、scopeを指定せずに複数のオブジェクトを生成してもインスタンスは1つです。都度新しいインスタンスを生成する場合は、beanに以下のように設定します。

 <bean id="person" class="hello.Person" scope="prototype">

 

DIコンテナのメリット

何が便利かというとユニットテストが書きやすい。あと、クラスがプラッガブルになるのでクラスの差し替えが容易です。 今後はWEBアプリケーションの構築に向けて理解を深めていきたいと思います。