DIコンテナ その3 Spring Framework編

の続き。

前回は標準APIであるEJB3を扱いました。今回は圧倒的シェアを誇るSpring Frameworkのフィールドインジェクションをやってみます。

まずインターフェースはEJBと同じ。違いはアノテーションがついてないくらいです。

package springtest;

public interface Hello{
    String getMessage(String name);
}


続いて実装クラス。これもアノテーションが違うことくらい。

package springtest;

@Component
public class HelloImpl implements Hello{
    public String getMessage(String name){
        return "はろー" + name + "さん";
    }
}


環境設定ファイル。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    

    <context:component-scan base-package="springtest"/>
    
</beans>

実質context:component-scanの1行だけ。ここにあるパッケージ以下のクラスをSpringに管理させるという意味です。


使用してみます。

package springtest;

import省略

@Component("main")
public class NewMain {

    @Autowired
    private Hello hello;

    public void print(){
        System.out.println( hello.getMessage("Spring") );
    }

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/springtest/applicationContext.xml");
        NewMain bean = (NewMain) context.getBean("main");
        bean.print();
        
    }

}

EJB3の@EJBが@Autowiredになっただけだと思うとよいでしょう。2.5からは面倒なXMLをいじらなくても非常に手軽に扱えます。それでいて2.0までのXMLによる定義も可能でほぼ100%の互換性を持っています。個人的にはSpringのXML定義は結構分かりやすいほうだと思います。アノテーションを使うかXMLを使うかのバランスは使用者にゆだねられているというのが面白いです。そして遅かったパフォーマンスも大きく改善しました。

これだけを見るとEJB3と何も違わないのが分かります。しかも、EJBと違い、トランザクションやリソース定義等を扱いたい場合は記述量は少ないながらも多少XMLをいじる必要が出てきます。柔軟に処理が可能ですが、EJBとくらべると分が悪いように見えます。

しかし、Springの魅力は大量にあるライブラリ群です。ほとんどのフレームワークがSpringの対応をまず第一に考えます。そして、Spring自体も他のフレームワークやライブラリとのコネクタを大量に持っています。

実際のところ機能がどうのこうのではなく、Springが採用されるのは実績があるというのが一番の理由でしょう。新しいWebフレームワークがStrutsの牙城を崩せない(特に日本国内は閉鎖的すぎる)のと同様にSpring以外を採用させる理由を探すのは非常に難しいことだと思われます。

逆に言えば「Springを使います」といったところで反対する現場はほとんどないでしょう。それが最大のメリットだと思われます。