<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Spring Framework</title><link>http://blogs.wankuma.com/kazuki/category/2111.aspx</link><description>Spring Framework</description><managingEditor>k.ota.0130あっとgmail.com(かずき)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java][NetBeans]Spring Framework 2.5とJSFの連携</title><link>http://blogs.wankuma.com/kazuki/archive/2009/05/18/173175.aspx</link><pubDate>Mon, 18 May 2009 23:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/05/18/173175.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/173175.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/05/18/173175.aspx#Feedback</comments><slash:comments>52</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/173175.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/173175.aspx</trackback:ping><description>&lt;p&gt;昨日に引き続きSpring Frameworkを触っていきます！&lt;br&gt;今回は、Spring FrameworkとJSFの連携をやってみようと思います。&lt;/p&gt; &lt;p&gt;Spring Frameworkは、2.x系から確かrequestスコープとsessionスコープをサポートしているので、結構お手軽に連携できたりします。&lt;br&gt;とりあえず、やってみませふ。&lt;/p&gt; &lt;h1&gt;早速作り始め&lt;/h1&gt; &lt;p&gt;Webアプリケーションを新規作成します。&lt;br&gt;プロジェクト名はspringjsfにして、フレームワークにJavaServer Facesを選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_thumb.png" width="228" height="125"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;連携のための設定&lt;/h2&gt; &lt;p&gt;新規作成したら、ライブラリにSpring Framework 2.5を追加します。&lt;br&gt;そして、web.xmlに以下の設定を追加します。これでWebアプリケーションでSpringが使えるようになるのに加えてrequestスコープとsessionスコープが使えるようになりまう。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a0f8a54c-6330-4eec-a2cf-74f4770c2946" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;listener&amp;gt;
    &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;
&amp;lt;/listener&amp;gt;
&amp;lt;filter&amp;gt;
    &amp;lt;filter-name&amp;gt;requestContextFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;filter-class&amp;gt;org.springframework.web.filter.RequestContextFilter&amp;lt;/filter-class&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;requestContextFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;次に、JSFの管理ビーンとしてSpringが管理してるビーンを使えるように設定します。&lt;br&gt;設定方法は、faces-config.xmlに以下の記述を追加します。&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7fbe6b18-2ced-416d-bfe0-1b87652cdbf4" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;

&amp;lt;faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&amp;gt;
    &amp;lt;application&amp;gt;
        &amp;lt;!-- Spring連携用 --&amp;gt;
        &amp;lt;variable-resolver&amp;gt;org.springframework.web.jsf.DelegatingVariableResolver&amp;lt;/variable-resolver&amp;gt;
    &amp;lt;/application&amp;gt;
&amp;lt;/faces-config&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、WEB-INF/applicationContext.xmlにSpring XML 構成ファイルを作成します。Spring名前空間には、contextを追加しておきます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_thumb_3.png" width="163" height="83"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;applicationContext.xmlを作成したら、以下のように編集して、springjsf以下のアノテーションつきのクラスを自動登録するように構成します。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3e1025e4-c04f-4e2c-800f-5cd0db950a1a" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"&amp;gt;
    &amp;lt;context:component-scan base-package="springjsf" /&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Springの管理するビーンの作成&lt;/h2&gt;
&lt;p&gt;下準備が出来たので、プログラミングを行います。&lt;br&gt;まず、welcomeJSF.jspに対応する管理ビーンを作成します。&lt;/p&gt;
&lt;p&gt;普通ならJSFの管理ビーンとして作成するのですが、今回はSpring用のビーンとして作成します。&lt;br&gt;普通のクラスの新規作成で、「springjsf.WelcomeJSFPage」というクラスを作成します。&lt;br&gt;作成したら、さくっと以下のように編集します。&lt;/p&gt;
&lt;p&gt;特に説明のいらないHello worldクラスのプログラムです。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f13f4d7f-aba5-4fd1-b55c-719542517349" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="java"&gt;package springjsf;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

// requestスコープでwelcomeJSFという名前でSpringに登録する
@Component("welcomeJSF")
@Scope("request")
public class WelcomeJSFPage {
    // 入力用
    private String inputMessage;

    // 出力用
    private String outputMessage;

    // 入力メッセージから出力メッセージを作成する
    public String createOutputMessage() {
        outputMessage = inputMessage + "と入力しましたね！";
        return null;
    }

    public String getInputMessage() {
        return inputMessage;
    }

    public void setInputMessage(String inputMessage) {
        this.inputMessage = inputMessage;
    }

    public String getOutputMessage() {
        return outputMessage;
    }

    public void setOutputMessage(String outputMessage) {
        this.outputMessage = outputMessage;
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;最後に、このSpringに登録されているWelcomeJSFPageクラスを使うようにwelcomeJSF.jspを以下のように編集します。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:96218924-40ae-4efa-92fb-243b3c513bb0" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@page contentType="text/html" pageEncoding="UTF-8"%&amp;gt;

&amp;lt;%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%&amp;gt;
&amp;lt;%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%&amp;gt;

&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;

&amp;lt;f:view&amp;gt;
    &amp;lt;html&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&amp;gt;
            &amp;lt;title&amp;gt;うぇるかむ&amp;lt;/title&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;h:form&amp;gt;
                入力：&amp;lt;h:inputText value="#{welcomeJSF.inputMessage}" /&amp;gt;
                &amp;lt;br /&amp;gt;
                &amp;lt;h:commandButton value="加工" action="#{welcomeJSF.createOutputMessage}" /&amp;gt;
                &amp;lt;br /&amp;gt;
                出力：&amp;lt;h:outputText value="#{welcomeJSF.outputMessage}" /&amp;gt;
            &amp;lt;/h:form&amp;gt;
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&amp;lt;/f:view&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注目は、管理ビーンに登録されていないのにEL式でwelcomeJSFと使ってる点です。&lt;br&gt;これで、Springに登録したwelcomeJSFというビーンが使えます。&lt;/p&gt;
&lt;p&gt;ちょっと悲しいのは、NetBeansの補間機能が働かないといったところでしょうか・・・&lt;/p&gt;
&lt;p&gt;実行すると&lt;/p&gt;
&lt;p&gt;画面が表示され&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_thumb_4.png" width="244" height="126"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;何か入力して加工ボタンを押すと&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_5.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/JavaNetBeansSpringFramework2.5JSF_13F6A/image_thumb_5.png" width="244" height="119"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ちゃんと動いてることが確認できます。&lt;/p&gt;
&lt;p&gt;以上簡単にですが、SpringとJSFの連携についてでした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/173175.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[NetBeans][Java]Spring Framework 2.5 とJPAの連携</title><link>http://blogs.wankuma.com/kazuki/archive/2009/05/17/173123.aspx</link><pubDate>Sun, 17 May 2009 23:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/05/17/173123.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/173123.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/05/17/173123.aspx#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/173123.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/173123.aspx</trackback:ping><description>&lt;p&gt;久しくさぼってたSpring Frameworkですが、NetBeans 6.7 Beta版が出たのでつっついてみたいと思います。&lt;br&gt;今日のお題はSpring Framework + JPAを試してみようと思います。&lt;/p&gt; &lt;h1&gt;データベースの作成&lt;/h1&gt; &lt;p&gt;とりあえず、お試しようのデータベースを作成します。&lt;br&gt;SpringとJPAの連携がメインなので、DBはシンプルに外部キーとかのない１テーブルのみのDBにします。&lt;/p&gt; &lt;p&gt;サーバウィンドウのデータベースの下のJavaDBで右クリックしてデータベースを作成を選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb.png" width="244" height="128"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;DB名、ユーザ名、パスワードすべてjpaeduのデータベースを作成します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_3.png" width="244" height="108"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;DBが作成されると、DBの接続も出来るので右クリックして接続を選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_4.png" width="244" height="76"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;APPの下の表の右クリックメニューからコマンドを実行を選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_5.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_5.png" width="244" height="112"&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;以下のSQLを打ち込んで実行してテスト用のテーブルを作成します。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d71b2c17-d22a-40ba-87c8-157abadc511d" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="sql"&gt;create table Person (
    id int primary key,
    name varchar(255));&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;以上でDBの作成は完了です。&lt;/p&gt;
&lt;h1&gt;プロジェクトの作成&lt;/h1&gt;
&lt;p&gt;DBの準備が終わったので、Javaのプロジェクトを作成していきます。&lt;br&gt;springjpaeduという名前で、Java アプリケーションのプロジェクトを作成します。&lt;/p&gt;
&lt;h2&gt;エンティティクラスの作成&lt;/h2&gt;
&lt;p&gt;プロジェクトを作成したら、springjpaedu.entitiesというパッケージを作成して、そこに新規→データベースからのエンティティクラスを選択してエンティティクラスを作成します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_6.png" width="670" height="187"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;先ほど作ったjpaeduデータベースを選択して、PERSONテーブルを選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_7.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_7.png" width="244" height="87"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次の画面で、持続性ユニットを作成を選択して持続性ユニットを作成します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_8.png" width="244" height="112"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;持続性ユニットを作成したら、その他の項目はデフォルトのまま作成します。&lt;br&gt;作成が完了すると、springjpaedu.entities.Personクラスが作成されます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_9.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_9.png" width="175" height="60"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;作成されたら、ちゃんと動くかの確認も兼ねて、テスト用データ作成プログラムを作ります。&lt;br&gt;JPAを使うこと自体が主題ではないので、プログラムだけのせます。&lt;br&gt;とりあえずDBをクリアして、1000件データを作成しているだけのプログラムです。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:68b20506-ad0d-4193-9a1d-5fe56f9a24a7" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="java"&gt;package springjpaedu;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import springjpaedu.entities.Person;

public class Main {

    private static final String PU = "springjpaeduPU";

    public static void main(String[] args) {
        EntityManagerFactory emf = null;
        EntityManager em = null;
        try {
            emf = Persistence.createEntityManagerFactory(PU);
            em = emf.createEntityManager();
            execute(em);
        } finally {
            if (em != null) {
                em.close();
            }
            if (emf != null) {
                emf.close();
            }
        }
    }

    private static void execute(EntityManager em) {
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            int deleted = em.createQuery("delete from Person").executeUpdate();
            for (int i = 1; i &amp;lt;= 1000; i++) {
                Person p = new Person();
                p.setId(i);
                p.setName("田中　太郎" + i);
                em.persist(p);
            }
            tx.commit();
            System.out.println(deleted + "件のデータを削除しました");
            System.out.println("1000件のデータを作成しました");
        } catch (RuntimeException e) {
            tx.rollback();
            System.out.println("失敗");
            e.printStackTrace();
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このまま実行すると、恐らくエラーがおきてしまいます。&lt;br&gt;JavaDBのJDBCドライバをライブラリについかしていないのが原因なので、JavaDBのドライバをライブラリに追加します。&lt;/p&gt;
&lt;p&gt;最近のJavaを何も意識せずに入れていると、C:\Program Files\Sun\JavaDB\lib\derbyclient.jarにJavaDBのJDBCドライバがあるので、それをライブラリに追加します。&lt;/p&gt;
&lt;p&gt;実行すると、↓のような文字列が出力ウィンドウに表示されるはずです。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9971dc70-7c96-4833-b4e7-1831a3ccc823" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;run:
[EL Info]: 2009.05.17 18:35:44.959--ServerSession(25197736)--EclipseLink, version: Eclipse Persistence Services - 1.0.1 (Build 20080905)
[EL Info]: 2009.05.17 18:35:45.118--ServerSession(25197736)--file:/C:/Users/Kazuki/Documents/NetBeansProjects/springjpaedu/src/-springjpaeduPU login successful
0件のデータを削除しました
1000件のデータを作成しました
[EL Info]: 2009.05.17 18:35:46.252--ServerSession(25197736)--file:/C:/Users/Kazuki/Documents/NetBeansProjects/springjpaedu/src/-springjpaeduPU logout successful
構築成功 (合計時間: 2 秒)&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Springの設定&lt;/h1&gt;
&lt;p&gt;ついにSpring Frameworkのほうに入ります！&lt;br&gt;まず、ライブラリからSpring Framework 2.5を選択して追加します。これには、以下の３つのjarファイルが含まれています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;spring-2.5.jar&lt;/li&gt;
&lt;li&gt;cglib-2.2.jar&lt;/li&gt;
&lt;li&gt;commons-logging-1.1.jar&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;凝ったことをしないのであればこれでいいのですが、今回はちょっとこれだけだと都合が悪いので、aspectjrt.jarもライブラリに追加します。&lt;br&gt;これは、Spring Frameworkのページから一式入ったものをダウンロードした中に入っているので、それを追加しました。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_10.png" width="321" height="82"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;つぎに、このspringjpaedu.DaoTestMainクラスを作成して、mainメソッドを作っておきます。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6acf97be-1769-4645-80aa-bf4eda33457f" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="java"&gt;package springjpaedu;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DaoTestMain {

    public static void main(String[] args) {
        AbstractApplicationContext ctx = null;
        try {
            ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            // TODO : ここに処理を書いていく予定
        } finally {
            ctx.close();
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;次に、デフォルトパッケージにapplicationContext.xmlを作成します。ソースパッケージの右クリックメニューから新規→その他からSpring XML 構成ファイルを選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_11.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_11.png" width="244" height="140"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ファイル名をapplicationContext(xmlはつけない)にして次へ&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_12.png" width="244" height="107"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;名前空間には、contextとtxを選んで完了を押してください。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_13.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/NetBeansJavaSpringFramework2.5JPA_1055F/image_thumb_13.png" width="516" height="233"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;DaoTestMainを実行して、エラーが出ないことを確認すれば下準備完了です。&lt;/p&gt;
&lt;h1&gt;やっとDAO&lt;/h1&gt;
&lt;p&gt;ついにSpringとJPAの連携の機能を作りこんでいきます！長かった…&lt;/p&gt;
&lt;p&gt;Spring FrameworkとJPAの連携は、2通りの方法があります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hibernateとかと同じように***DaoSupportと***Templateクラスを使う方法&lt;/li&gt;
&lt;li&gt;JPAのAPIをそのまま使う方法&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;今回は２番のJPAのAPIをそのまま使う方法をやってみます。&lt;br&gt;何故かというと、１の方法でもあまりうれしさが感じれないからです。Hibernateとかで経験がある人が、自然に使いはじめれるという利点があるくらいなのかな？&lt;/p&gt;
&lt;p&gt;とりあえずDAOを作っていきます！&lt;/p&gt;
&lt;p&gt;springjpaedu.daoパッケージを作成して、そこにPersonDaoインターフェースとPersonDaoImplクラスを作成します。&lt;/p&gt;
&lt;p&gt;PersonDaoに、CRUD用のメソッドを一通り作成します。&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3bf7c52a-4a4b-4667-aa74-fcd73b65d2f3" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="java"&gt;package springjpaedu.dao;

import java.util.List;
import springjpaedu.entities.Person;

public interface PersonDao {
    List&amp;lt;Person&amp;gt; findAll();
    Person get(int id);
    void update(Person p);
    void insert(Person p);
    void delete(Person p);
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;PersonDaoImplで、これを実装していきます。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:43bb9bcc-f457-416d-a7fc-9b8c9b773500" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="java"&gt;package springjpaedu.dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import springjpaedu.entities.Person;

// トランザクションの定義
@Transactional
// Springに自動登録してもらうための印
@Repository("personDao")
public class PersonDaoImpl implements PersonDao {

    // PersistenceContextをつけておくとSpringが適切にインスタンスをセットしてくれる
    @PersistenceContext
    private EntityManager entityManager;

    @Transactional(readOnly=true)
    public List&amp;lt;Person&amp;gt; findAll() {
        return entityManager.
                createQuery("select p from Person p order by p.id").
                getResultList();
    }

    // 以下のメソッドでEntityManagerを使って色々処理を書く
    @Transactional(readOnly=true)
    public Person get(int id) {
        return entityManager.find(Person.class, id);
    }

    public void update(Person p) {
        entityManager.merge(p);
    }

    public void insert(Person p) {
        entityManager.persist(p);
    }

    public void delete(Person p) {
        entityManager.remove(p);
    }

}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;特別なことは別にしてなくて、EJB3のコンテナでもそのまま動きそう。&lt;/p&gt;
&lt;p&gt;これを使うようにSpringの定義ファイルを書いていきます。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:906ccf5c-4b97-4755-ad3c-268f78373408" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&amp;gt;
    &amp;lt;!-- EntityManagerFactoryとTransactionManagerを定義 --&amp;gt;
    &amp;lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"&amp;gt;
        &amp;lt;property name="persistenceUnitName" value="springjpaeduPU" /&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&amp;gt;
        &amp;lt;property name="entityManagerFactory" ref="entityManagerFactory" /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- JPAの例外をSpringの例外に変換してくれる --&amp;gt;
    &amp;lt;bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /&amp;gt;
    &amp;lt;!-- PersistenceContextアノテーションにEntityManagerをインジェクションしてくれる --&amp;gt;
    &amp;lt;bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /&amp;gt;

    &amp;lt;!-- DAOを自動登録（今回の場合１つしかないからあまりありがたみは無いかも --&amp;gt;
    &amp;lt;context:component-scan base-package="springjpaedu.dao" /&amp;gt;

    &amp;lt;!-- アノテーションベースのトランザクション制御 --&amp;gt;
    &amp;lt;tx:annotation-driven /&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こいつが動くかどうか簡単に確認してみようと思います。&lt;br&gt;動作を確認するために、CRUDを一通りするプログラムを作成してみました。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5df9810e-9953-4a91-b4ab-f0e0ade97660" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="java"&gt;package springjpaedu;

import java.util.List;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springjpaedu.dao.PersonDao;
import springjpaedu.entities.Person;

public class DaoTestMain {

    public static void main(String[] args) {
        AbstractApplicationContext ctx = null;
        try {
            ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            PersonDao dao = (PersonDao) ctx.getBean("personDao");
            
            // 全件表示
            List&amp;lt;Person&amp;gt; people = dao.findAll();
            System.out.println("## 全データ出力");
            System.out.println(people);

            // 1件取得して更新
            Person p = dao.get(1);
            p.setName("田中　麻呂");
            dao.update(p);

            // 更新された値を確認
            Person p2 = dao.get(1);
            System.out.println("更新後の名前: " + p2.getName());

            // 新しい人を登録
            Person newPerson = new Person();
            newPerson.setId(1001);
            newPerson.setName("木村　きむきむ");
            dao.insert(newPerson);

            // 新しく登録された人を確認
            Person newPerson2 = dao.get(1001);
            System.out.println("追加した人の名前: " + newPerson2.getName());
        } finally {
            ctx.close();
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行すると&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:53b01ea7-4d4b-46c3-96f4-00159b57dc55" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;## 全データ出力
[springjpaedu.entities.Person[id=1], springjpaedu.entities.Person[id=2], springjpaedu.entities.Person[id=3], spri...省略]
更新後の名前: 田中　麻呂
追加した人の名前: 木村　きむきむ&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ちゃんと更新とかもされているっぽいです。&lt;br&gt;META-INF/persistence.xmlを以下のようにすると、&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a0db0f54-7149-4103-8c71-22eeeb3f15ce" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&amp;gt;
  &amp;lt;persistence-unit name="springjpaeduPU" transaction-type="RESOURCE_LOCAL"&amp;gt;
    &amp;lt;provider&amp;gt;org.eclipse.persistence.jpa.PersistenceProvider&amp;lt;/provider&amp;gt;
    &amp;lt;class&amp;gt;springjpaedu.entities.Person&amp;lt;/class&amp;gt;
    &amp;lt;properties&amp;gt;
      &amp;lt;property name="eclipselink.jdbc.password" value="jpaedu"/&amp;gt;
      &amp;lt;property name="eclipselink.jdbc.user" value="jpaedu"/&amp;gt;
      &amp;lt;property name="eclipselink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/&amp;gt;
      &amp;lt;property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/jpaedu"/&amp;gt;
      &amp;lt;!-- SQLのログを出力 --&amp;gt;
      &amp;lt;property name="eclipselink.logging.level" value="FINE" /&amp;gt;
    &amp;lt;/properties&amp;gt;
  &amp;lt;/persistence-unit&amp;gt;
&amp;lt;/persistence&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実際に発行されているSQL文も表示されていい感じになりそうです。&lt;br&gt;データ作成用のMainを起動してDBを初期化して、Javaのファイル以外を更新したので生成物を削除して構築をしてDaoTestMainを実行すると…&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a4f68f04-586b-41c6-a77a-dfca97543baa" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c"&gt;[EL Fine]: 2009.05.17 23:08:16.602--ServerSession(2719739)--Connection(6586390)--Thread(Thread[main,5,main])--SELECT ID, NAME FROM PERSON ORDER BY ID ASC
## 全データ出力
[springjpaedu.entities.Person[id=1], springjpaedu.entities.Person[id=2], springjpaedu.entities.Person[id=3], springjpaedu.entities.Person[id=4], springjp...省略]]
[EL Fine]: 2009.05.17 23:08:16.802--ClientSession(20804180)--Connection(27660658)--Thread(Thread[main,5,main])--UPDATE PERSON SET NAME = ? WHERE (ID = ?)
        bind =&amp;gt; [田中　麻呂, 1]
更新後の名前: 田中　麻呂
[EL Fine]: 2009.05.17 23:08:16.809--ClientSession(24809582)--Connection(9870377)--Thread(Thread[main,5,main])--INSERT INTO PERSON (ID, NAME) VALUES (?, ?)
        bind =&amp;gt; [1001, 木村　きむきむ]
追加した人の名前: 木村　きむきむ&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;うん。大丈夫そう。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/173123.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework 2.5入門 「BeanFactoryAwareインターフェース」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/20/168498.aspx</link><pubDate>Fri, 20 Feb 2009 13:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/20/168498.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168498.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/20/168498.aspx#Feedback</comments><slash:comments>1149</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168498.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168498.aspx</trackback:ping><description>&lt;p&gt;今回は、BeanFactoryAwareインターフェースについてです。このインターフェースはvoid setBeanFactory(BeanFactory factory)というメソッドを１つ備えただけの単純なインターフェースです。&lt;br&gt;最初に言っておくと、このインターフェースはめったに使いません。というか使わなければならなくなったら、本当に使わなければならないのだろうか？としっかり考えた上で使うことが必要です。&lt;/p&gt; &lt;p&gt;このインターフェースを実装したクラスをSpringが見つけると、setBeanFactoryメソッドからBeanFactoryのインスタンスを渡してくれます。つまり、BeanFactoryをがりがり使って色んなステキなことが出来そうな気がします。&lt;/p&gt; &lt;p&gt;ただし、&lt;strong&gt;&lt;font color="#008080" size="5"&gt;Springにがっつり依存してしまうことになるので、POJOに比べて格段にテストしにくいものになってしまいます。大体のケースでは、きっともっといい方法があるはずなので、使う時は慎重に。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;ということで使ってみよう。「springaware」というプロジェクトを作ってSpring Framework 2.5のライブラリを追加します。&lt;br&gt;そして、springaware.SpringDependBeanを作成します。このクラスにBeanFactoryAwareインターフェースを実装しちゃいます。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b738f6d0-1606-40e3-afdc-4cb97e7aec0e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springaware;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

public class SpringDependBean implements BeanFactoryAware {
    private BeanFactory factory;

    public void setBeanFactory(BeanFactory factory) throws BeansException {
        this.factory = factory;
    }

    public void printValue() {
        // ファクトリからvalueという名前で登録されているものをプリントする
        System.out.println("value: " + factory.getBean("value"));
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、Springの定義ファイルを書きます。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f8454de6-5c52-4dab-9483-689eb7960f64" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;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-2.5.xsd"&amp;gt;
    &amp;lt;!-- このInteger型を印字する --&amp;gt;
    &amp;lt;bean id="value" class="java.lang.Integer"&amp;gt;
        &amp;lt;constructor-arg type="int" value="100" /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;bean id="awareBean" class="springaware.SpringDependBean" /&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;後は、いつもどおりApplicationContextを作ってgetBeanでインスタンスを取得して使えます。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:871f73fd-186f-4520-a139-1516e3bff2b0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springaware;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
        SpringDependBean bean = (SpringDependBean) ctx.getBean("awareBean");
        bean.printValue(); // value: 100と表示される
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;簡単ですね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168498.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework 2.5入門 「ファクトリメソッドの指定」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/20/168472.aspx</link><pubDate>Fri, 20 Feb 2009 00:04:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/20/168472.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168472.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/20/168472.aspx#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168472.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168472.aspx</trackback:ping><description>&lt;p&gt;Spring Framework 2.5には、クラスのインスタンスを生成するときにコンストラクタじゃなくてクラスのメソッドを指定することができる。&lt;br&gt;メソッドの指定は、beanタグのfactory-method属性で指定できます。&lt;/p&gt; &lt;p&gt;たとえば、以下のような典型的なSingletonパターンで作られてしまったようなクラスがあったとします。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:599817fc-e398-4ccc-a6d1-cf412f0e8712" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springfactorymethod;

public class SingletonObject {
    // 唯一のインスタンス
    private static final SingletonObject instance = new SingletonObject();

    // 外部からのインスタンス化禁止
    private SingletonObject() {}

    // 唯一のインスタンス取得口
    public static SingletonObject getInstance() {
        return instance;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これをSpringに登録して使うときには、以下のような定義を行います。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6bb08de3-70ba-40b1-9646-77cb064030d2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;!-- factory-method属性で、インスタンスを生成するメソッドを指定する --&amp;gt;
&amp;lt;bean id="singletonObject" class="springfactorymethod.SingletonObject"
    factory-method="getInstance" /&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;この定義を読み込ませて、ApplicationContextのgetBeanメソッドからインスタンスを取得すると、getInstanceが呼ばれてインスタンスが返されます。&lt;br&gt;factory-methodに引数がある場合は、constructor-arg要素で指定できるようです。&lt;/p&gt;
&lt;p&gt;factory-bean属性も追加すると、別のbeanの特定のインスタンスからインスタンスを取得するようにも出来るみたいです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168472.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework 2.5入門 「beanのコールバックメソッド」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/18/168374.aspx</link><pubDate>Wed, 18 Feb 2009 22:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/18/168374.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168374.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/18/168374.aspx#Feedback</comments><slash:comments>795</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168374.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168374.aspx</trackback:ping><description>&lt;p&gt;前回は、beanのスコープについて軽く学んだ。&lt;br&gt;今回は、beanのコールバックメソッドについて学んでみようと思います。&lt;/p&gt; &lt;p&gt;Springは、インスタンスが生成されたタイミング（厳密にいうと少し違うけど）と、インスタンスが破棄されるタイミングで、特定の処理を走らせることが出来るようになっています。&lt;br&gt;インスタンスが生成されたタイミングというのは、コンストラクタっていうのがすでにJavaにあるじゃん？といった感じですが、処理が実行されるタイミングが微妙に違って、Springによってプロパティの初期化が行われたあとに呼ばれます。&lt;/p&gt; &lt;p&gt;このコールバックメソッドの指定方法には、３つの方法が提供されています。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;所定のインターフェースのメソッドを実装する&lt;br&gt;OOPをしたことがある人にとって、恐らくもっともわかりやすい方法。&lt;br&gt;ただし、クラスがSpringのインターフェースに依存してしまう。&lt;/li&gt; &lt;li&gt;Springの定義ファイルにメソッド名を指定する&lt;br&gt;Springの定義ファイルで、初期化時と、破棄時に呼ぶメソッドを名前で指定します。&lt;br&gt;クラスがSpringに依存しなくなります。&lt;/li&gt; &lt;li&gt;アノテーションを使用する。&lt;br&gt;JSR-220のアノテーションを使用することも出来ます。&lt;br&gt;最近流行のアノテーションなので、カッコいい気がします。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;個人的には、２か３のどちらかかなぁと思っていますが、確か３はJavaSE6から普通に使えるようになってるらしいのでJavaSE5の人は、２あたりを使っておくのが一番つぶしがきくかもしれません。&lt;/p&gt; &lt;h1&gt;ということで実験&lt;/h1&gt; &lt;p&gt;NetBeans6.5を立ち上げて、springlifecycleというプロジェクトを作成してライブラリにSpring Frameowrk 2.5を追加する。ここら辺までは手馴れてきた。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/JavaSpringFramework2.5bean_14157/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="180" alt="image" src="http://kazuki.wankuma.com/images/2009/JavaSpringFramework2.5bean_14157/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;上の画面では、すでに作っていますが、springlifecycle.beansパッケージを作成します。ここにクラスを定義していきます。&lt;br&gt;まずは、インターフェースを定義するタイプのクラスを作成します。&lt;br&gt;インターフェースは、初期化用と破棄用の２つが用意されていて、org.springframework.beans.factory.InitializingBeanインターフェースとorg.springframework.beans.factory.DisposableBeanインターフェースになります。&lt;/p&gt; &lt;p&gt;InitializingBeanにはafterPropertiesSetメソッドが定義されていて、DisposableBeanにはdestroyメソッドが定義されています。ということで早速実装したクラスを定義します。&lt;br&gt;クラス名はInitDestoryBean1にしました。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f84ad2ad-a98c-4108-aa40-41eeed8b8e22" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springlifecycle.beans;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class InitDestroyBean1 implements InitializingBean, DisposableBean {

    private Integer value;

    public InitDestroyBean1() {
        System.out.println(this + ":InitDestroyBean1 " + value);
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println(this + ":afterPropertiesSet " + value);
    }

    public void destroy() throws Exception {
        System.out.println(this + ":destroy " + value);
    }

    public void setValue(Integer value) {
        this.value = value;
    }


}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、Springの定義ファイルとしてapplication.xmlを作成して以下のbeanの定義を追加します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:4e60ce8e-896d-45e3-810f-a7d6c7eca087" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean id="initDestoryBean1" class="springlifecycle.beans.InitDestroyBean1"&amp;gt;
    &amp;lt;property name="value" value="100" /&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;予想としては、まず、InitDestroyBean1のコンストラクタが実行されます。このタイミングではDIがされていないので、valueはnullと表示されます。&lt;br&gt;その次に、afterPropertiesSetが呼ばれます。この段階では、DIが行われているので、valueは100と表示されるはずです。&lt;br&gt;そして、最後にコンテナが破棄されるタイミングでdestroyが実行されます。&lt;/p&gt;
&lt;p&gt;ということで以下のMainを書いて早速実行！&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:79f02c26-f12b-4e3e-b9a3-c67e53522cd7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springlifecycle;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springlifecycle.beans.InitDestroyBean1;

public class Main {
    public static void main(String[] args) {
        // closeメソッドを呼ぶので、AbstractApplicationContextクラスを使う
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
        InitDestroyBean1 bean1 = (InitDestroyBean1) ctx.getBean("initDestroyBean1");
        ctx.close(); // コンテナを破棄
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;実行結果は…&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:777b57a9-ba62-4e9c-8168-72bdd2fa1835" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="ruby"&gt;springlifecycle.beans.InitDestroyBean1@bfc8e0:InitDestroyBean1 null
springlifecycle.beans.InitDestroyBean1@bfc8e0:afterPropertiesSet 100
springlifecycle.beans.InitDestroyBean1@bfc8e0:destroy 100&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;予想通り！！&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;次に、Springの定義ファイルで指定する方法を実験してみます。&lt;br&gt;Springの定義ファイルで指定する場合は、特定のインターフェースとかは実装しなくてもOKです。とりあえず初期化メソッドをinit、破棄のメソッドをdestroyにして実装してみました。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8c779852-d22c-4e1b-b682-c878e1b660ca" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springlifecycle.beans;

public class InitDestroyBean2 {

    private Integer value;

    public InitDestroyBean2() {
        System.out.println(this + ":InitDestroyBean2 " + value);
    }

    public void init() {
        System.out.println(this + ":init " + value);
    }

    public void destroy() {
        System.out.println(this + ":destroy " + value);
    }

    public void setValue(Integer value) {
        this.value = value;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;このメソッドを初期化時と、破棄時に呼び出すようにするには定義ファイルのbean属性にinit-method属性と、destroy-method属性にメソッド名を設定します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f60a811d-eb29-4451-a529-6cb448be069b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean id="initDestroyBean2" 
        class="springlifecycle.beans.InitDestroyBean2"
        init-method="init"
        destroy-method="destroy"&amp;gt;
    &amp;lt;property name="value" value="100" /&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Mainも実装します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:18dc5e01-be4a-47f2-9f72-bb9c62a9a3b0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springlifecycle;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springlifecycle.beans.InitDestroyBean2;

public class Main {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
        InitDestroyBean2 bean2 = (InitDestroyBean2) ctx.getBean("initDestroyBean2");
        ctx.close(); // コンテナを破棄
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;これの実行結果も、インターフェースを実装したときと同じになります。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b2ccedd2-dcce-4a56-beca-484ebbdbcadd" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="ruby"&gt;springlifecycle.beans.InitDestroyBean2@bfc8e0:InitDestroyBean2 null
springlifecycle.beans.InitDestroyBean2@bfc8e0:init 100
springlifecycle.beans.InitDestroyBean2@bfc8e0:destroy 100&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;コンストラクタでは、nullのフィールドが、initでは値が表示されてることがわかります。&lt;/p&gt;
&lt;p&gt;ちなみに、このinit-method属性とdestroy-method属性は、beansタグにdefault-init-method属性と、default-destroy-method属性で複数のbeanに対して一括で設定できます。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;最後に、属性を使った場合について書きます。&lt;br&gt;属性は、以下の２つを使います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;javax.annotation.PostConstruct&lt;br&gt;初期化時のメソッドを指定します。&lt;/li&gt;
&lt;li&gt;javax.annotation.PreDestroy&lt;br&gt;破棄時のメソッドを指定します。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;これも、さくっと実装します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:161baa65-9b81-4198-ac83-8fe0e9865608" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springlifecycle.beans;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class InitDestroyBean3 {

    private Integer value;

    public InitDestroyBean3() {
        System.out.println(this + ":InitDestroyBean2 " + value);
    }

    @PostConstruct
    public void init() {
        System.out.println(this + ":init " + value);
    }

    @PreDestroy
    public void destroy() {
        System.out.println(this + ":destroy " + value);
    }

    public void setValue(Integer value) {
        this.value = value;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、application.xmlへの定義も行います。この場合は、追加の属性で、init-methodやdestroy-methodの指定は行いません。&lt;br&gt;その代わりに、以下のクラスを定義する必要があります。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:61cb734c-2b50-4b9f-89e3-308fd0a85979" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;このクラスを定義しておくことで、アノテーションによる設定が有効になります。&lt;/p&gt;
&lt;p&gt;続けてInitDestroyBean3を定義します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b9b5116b-d5bc-45c2-8f4a-98b351b94004" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean id="initDestroyBean3"
        class="springlifecycle.beans.InitDestroyBean3"&amp;gt;
    &amp;lt;property name="value" value="100" /&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、Mainをぱぱっと書きます。&lt;/p&gt;
&lt;p&gt;これを実行して結果を見てみると、過去の２つと同じ結果になりました。（細かい文言はきしないで）&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0c88f4a5-abc3-4df7-8057-42aa26e705fa" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;springlifecycle.beans.InitDestroyBean3@a46701:InitDestroyBean2 null
springlifecycle.beans.InitDestroyBean3@a46701:init 100
springlifecycle.beans.InitDestroyBean3@a46701:destroy 100
&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168374.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework2.5入門 「beanのスコープ」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/17/168272.aspx</link><pubDate>Tue, 17 Feb 2009 12:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/17/168272.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168272.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/17/168272.aspx#Feedback</comments><slash:comments>82</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168272.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168272.aspx</trackback:ping><description>&lt;p&gt;今回はbeanのスコープについてのお話です。&lt;br&gt;beanのスコープというのは、Springが、どの範囲でbeanのインスタンスを生成・破棄するかを指定するものになります。&lt;br&gt;Spring Framework2.5では、以下の５つのスコープがあります。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;singleton&lt;br&gt;１つのコンテナ内で１つのインスタンス（デフォルトはこれになる）&lt;/li&gt; &lt;li&gt;prototype&lt;br&gt;コンテナからbeanを取得するたびにインスタンスを生成する&lt;/li&gt; &lt;li&gt;request&lt;br&gt;Webアプリ専用。HTTPのRequest単位でインスタンスを生成する。&lt;/li&gt; &lt;li&gt;session&lt;br&gt;Webアプリ専用。HTTPのSession単位でインスタンスを生成する。&lt;/li&gt; &lt;li&gt;global session&lt;br&gt;ポートレット専用。詳しくないのでよくわからない。グローバルセッションというものがあるらしい。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;3以降は、Web系でしか使えないので、コンソールアプリとかで少し試すぶんにはsingletonとprototypeの２つになります。&lt;br&gt;今回は、この２つの動きについて見ていこうと思います。残りの部分については、勧めていく過程で使えるようになったら使っていきます。&lt;/p&gt; &lt;p&gt;Springがインスタンスを生成したことがわかるように、コンストラクタにログを吐くように作ったクラスを１つ定義します。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;springscope/MyBean.java&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6b9a37bf-b7cf-4202-9d31-6dcc676494e7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springscope;

public class MyBean {
    public MyBean() {
        System.out.println("MyBean コンストラクタ");
    }
    public void execute() {
        System.out.println("MyBean#execute()実行");
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これをSpringに登録して、singletonとprototypeで出力されるメッセージの違いを観察します。&lt;br&gt;スコープの指定は、Springの定義ファイルで、beanタグにscope属性として指定します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;application.xml&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5316978b-544e-48da-9515-f6f3a3954523" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;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-2.5.xsd"&amp;gt;
    &amp;lt;!-- プロトタイプ --&amp;gt;
    &amp;lt;bean id="prototypeBean" class="springscope.MyBean" scope="prototype" /&amp;gt;

    &amp;lt;!-- シングルトン(scope属性を省略しても同じ) --&amp;gt;
    &amp;lt;bean id="singletonBean" class="springscope.MyBean" scope="singleton" /&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;この定義ファイルを読み込んでごにょごにょやるプログラムを書きます。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a49a1893-16c8-419f-ab02-9df0f3e2cb8e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springscope;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        System.out.println("ApplicationContextを作成");

        System.out.println("======================================");
        ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
        System.out.println("プロトタイプのBeanを２つ取得");
        MyBean prototype1 = (MyBean) ctx.getBean("prototypeBean");
        MyBean prototype2 = (MyBean) ctx.getBean("prototypeBean");
        System.out.println("処理を実行");
        prototype1.execute();
        prototype2.execute();

        System.out.println("======================================");
        System.out.println("シングルトンのBeanを２つ取得");
        MyBean singleton1 = (MyBean) ctx.getBean("singletonBean");
        MyBean singleton2 = (MyBean) ctx.getBean("singletonBean");
        System.out.println("処理を実行");
        singleton1.execute();
        singleton2.execute();
    }

}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行して、動きを確認します。&lt;br&gt;予想としては、プロトタイプのほうはインスタンスを取得するタイミングで2回コンストラクタを実行するログが出るはずです。シングルトンのほうは、1回何処かででるはず。&lt;/p&gt;
&lt;p&gt;ということで実行！&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2c24bc7b-d2f7-4cf2-b110-b5cab3e5a6ab" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;ApplicationContextを作成
======================================
MyBean コンストラクタ
プロトタイプのBeanを２つ取得
MyBean コンストラクタ
MyBean コンストラクタ
処理を実行
MyBean#execute()実行
MyBean#execute()実行
======================================
シングルトンのBeanを２つ取得
処理を実行
MyBean#execute()実行
MyBean#execute()実行
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ApplicationContextのインスタンス作成直後のタイミング（3行目）でMyBeanのインスタンスが１つ作られていることが確認できます。&lt;br&gt;これが、シングルトンのMyBeanのインスタンスが作成されるタイミングです。&lt;/p&gt;
&lt;p&gt;その後プロトタイプが２つ作られているのがわかります。最後のシングルトンのインスタンスを取得している所ではインスタンスが作られていないことも確認できます。&lt;/p&gt;
&lt;p&gt;ということでまとめ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;scopeは、Springのコンテナがbeanのインスタンスをどの単位で管理するかを指定するもの&lt;/li&gt;
&lt;li&gt;scopeは、５つある。&lt;/li&gt;
&lt;li&gt;webアプリ以外ではprototypeとsingletonの２つが使える。&lt;/li&gt;
&lt;li&gt;singletonはコンテナが作成されたタイミングでインスタンスが作成されて、それが使いまわされる。&lt;/li&gt;
&lt;li&gt;prototypeは、beanが取得されるたびにインスタンスが作られる。&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;以上です。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168272.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework 2.5入門 「ListやMapやProperties」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/16/168232.aspx</link><pubDate>Mon, 16 Feb 2009 21:35:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/16/168232.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168232.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/16/168232.aspx#Feedback</comments><slash:comments>908</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168232.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168232.aspx</trackback:ping><description>&lt;p&gt;今回も引き続き、Spring Framework2.5の超基本的なところを抑えていこうと思います。&lt;br&gt;今回は、Springの定義ファイル内で、ListやMapやPropertiesを使いたくなったときにどうするかについて勉強します。&lt;/p&gt; &lt;p&gt;といっても非常に簡単で、Listはlistタグ、Mapはmapタグ、Propertiesはpropsタグを使って定義します。&lt;br&gt;実際に試してみるために、以下のようなクラスを定義します。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bd4467bc-16c5-4775-8bf2-b9007e4faef5" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean;

import java.util.List;
import java.util.Map;
import java.util.Properties;

public class MyBean {
    private Map map;
    private List list;
    private Properties props;

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public Properties getProps() {
        return props;
    }

    public void setProps(Properties props) {
        this.props = props;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Map, List, Properties型のプロパティをもっただけのBeanです。このクラスのプロパティのListとMapとPropertiesに値をセットする定義ファイルを書いてみます。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a5af3491-d46b-45ba-aa2c-59465c99d31a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean id="myBean" class="springbean.MyBean"&amp;gt;
    &amp;lt;property name="list"&amp;gt;
        &amp;lt;!-- Listの定義はlistタグ --&amp;gt;
        &amp;lt;list&amp;gt;
            &amp;lt;!-- valueタグ、refタグ、beanタグなどを定義していくことで
            リストに要素を追加できる 
            この例では["aaaa", "bbbb", MyBeanのインスタンス]というListを定義している--&amp;gt;
            &amp;lt;value&amp;gt;aaaa&amp;lt;/value&amp;gt;
            &amp;lt;value&amp;gt;bbbb&amp;lt;/value&amp;gt;
            &amp;lt;bean id="sample" class="springbean.MyBean" /&amp;gt;
        &amp;lt;/list&amp;gt;
    &amp;lt;/property&amp;gt;

    &amp;lt;property name="map"&amp;gt;
        &amp;lt;!-- Mapの定義はmapタグ --&amp;gt;
        &amp;lt;map&amp;gt;
            &amp;lt;!-- entryタグでkeyとvalueのペアをあらわす 
            この例では、["a" =&amp;gt; "あ", "b" =&amp;gt; "い"]といったMapを定義している--&amp;gt;
            &amp;lt;entry key="a" value="あ" /&amp;gt;
            &amp;lt;entry&amp;gt;
                &amp;lt;!-- 属性でkeyとvalueを指定したり、タグで指定することも出来る --&amp;gt;
                &amp;lt;key&amp;gt;
                    &amp;lt;value&amp;gt;b&amp;lt;/value&amp;gt;
                &amp;lt;/key&amp;gt;
                &amp;lt;value&amp;gt;い&amp;lt;/value&amp;gt;
            &amp;lt;/entry&amp;gt;
        &amp;lt;/map&amp;gt;
    &amp;lt;/property&amp;gt;

    &amp;lt;property name="props"&amp;gt;
        &amp;lt;!-- Propertiesはpropsタグ --&amp;gt;
        &amp;lt;props&amp;gt;
            &amp;lt;!-- 1つのプロパティはpropタグであらわす 
            この例では、["a" =&amp;gt; "あいうえお", "b" =&amp;gt; "かきくけこ"]というPropertiesを定義している --&amp;gt;
            &amp;lt;prop key="a"&amp;gt;あいうえお&amp;lt;/prop&amp;gt;
            &amp;lt;prop key="ka"&amp;gt;かきくけこ&amp;lt;/prop&amp;gt;
        &amp;lt;/props&amp;gt;
    &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;とまぁこんな感じ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168232.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework 2.5入門 「DIコンテナのメリット」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/15/168168.aspx</link><pubDate>Sun, 15 Feb 2009 11:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/15/168168.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168168.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/15/168168.aspx#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168168.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168168.aspx</trackback:ping><description>&lt;p&gt;前回：&lt;a href="http://blogs.wankuma.com/kazuki/archive/2009/02/13/168090.aspx"&gt;[Java]Spring Framework 2.5入門 「依存性の注入」&lt;/a&gt;&lt;/p&gt; &lt;p&gt;前回までで、Spring Framework2.5のDIコンテナとしての基本的な機能は使えるようになってきました。&lt;br&gt;といっても、beanタグとpropertyタグとconstructor-argタグを使うだけですが。今回は、DIコンテナのメリットを書いてみようと思います。&lt;/p&gt; &lt;p&gt;一般的にDIコンテナを使ったプログラムでは、インターフェースを定義して、それを実装したクラスをDIコンテナに登録して使います。これまでのエントリでは、インターフェースは使わずに具象クラスのみ使っていました。&lt;/p&gt; &lt;p&gt;ということで、前回やったMyServiceとMyLogicをインターフェースを使うように変えてみます。&lt;br&gt;下記の４つを定義します。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;springbean.beans.MyLogicインターフェース&lt;/li&gt; &lt;li&gt;springbean.beans.MyLogicImplクラス&lt;/li&gt; &lt;li&gt;springbean.beans.MyServiceインターフェース&lt;/li&gt; &lt;li&gt;springbean.beans.MyServiceImplクラス&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;実装は特に悩むことはなく、単純にインターフェースと実装クラスのペアをつくっていくだけです。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;MyLogicインターフェース&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6f9d21ea-98ae-465e-b915-1c3ad6348340" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

public interface MyLogic {
    int add(int lhs, int rhs);
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;MyLogicImplクラス&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:038ad30e-08be-4568-9c18-f0a9575a5c4b" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

public class MyLogicImpl implements MyLogic {
    public int add(int lhs, int rhs) {
        return lhs + rhs;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;MyServiceインターフェース&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0a0915b3-cd93-4187-a996-bac4cfcbf2de" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

public interface MyService {
    int execute();
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;MyServiceImplクラス&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a2ef7599-ec11-4ccd-9d49-ef9aea2f9f7c" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

public class MyServiceImpl implements MyService {
    // インターフェースを受け取るようにする
    private MyLogic logic;

    private int lhs;
    private int rhs;

    public int execute() {
        return logic.add(lhs, rhs);
    }

    public void setLhs(int lhs) {
        this.lhs = lhs;
    }

    public void setLogic(MyLogic logic) {
        this.logic = logic;
    }

    public void setRhs(int rhs) {
        this.rhs = rhs;
    }


}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ここで大事なのが、MyServiceImplクラスが依存するものがMyLogicインターフェースになるという部分です。MyLogicインターフェースを実装するクラスなら何でもMyServiceImplに設定することが出来るようになります。&lt;/p&gt;
&lt;p&gt;当然application.xmlも変更が入ります。MyLogicImplとMyServiceImplを定義するように変更します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;application.xml(beansタグの内側だけ抜粋)&lt;/u&gt;&lt;/strong&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:66993455-a32a-4ba4-9dfe-756d8e550d20" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean id="myLogic" class="springbean.beans.MyLogicImpl" /&amp;gt;

&amp;lt;bean id="myService" class="springbean.beans.MyServiceImpl"&amp;gt;
    &amp;lt;property name="logic" ref="myLogic" /&amp;gt;
    &amp;lt;property name="lhs" value="100" /&amp;gt;
    &amp;lt;property name="rhs" value="200" /&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Mainは特に変更はありませんが一応mainメソッド内部だけのせておきます。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8d34a282-b3e5-415d-b6b6-3953b6670414" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");

// インターフェースに対してプログラムを書く
MyService service = (MyService) ctx.getBean("myService");
System.out.println("service#execute = " + service.execute()); // 300と表示される
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これで、一般的なDIコンテナを使ったプログラムっぽい形になりました。正直、こんなめんどくさいことを何故するんだろう？と最初思いましたが、こうすることで”ユニットテストが非常にやりやすい”形になっています。&lt;/p&gt;
&lt;p&gt;MyServiceImplクラス内には、外部のクラスに直接依存する部分は排除される形になっています。MyServiceImplクラスを動かすための要件は、MyLogicインターフェースを実装したクラスがあるということだけになります。&lt;/p&gt;
&lt;p&gt;つまり、テストをしたければ、MyLogicインターフェースを実装したMyLogicMockみたいなクラスを作って、それを使ってテストが出来るようになります。&lt;/p&gt;
&lt;p&gt;ということでやってみましょう。Spring Frameworkには単体テストを支援する色々な機能が組み込まれていますが、ここでは、その機能は使わずに書いてみます。&lt;/p&gt;
&lt;p&gt;MyServiceImplが単体として満たさなければいけない要件は、以下の２つになると思います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;logicのaddメソッドにlhsフィールド, rhsフィールドの値をちゃんと渡す。&lt;/li&gt;
&lt;li&gt;logicのaddメソッドの結果をちゃんと返す。&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;ということで、早速MyLogicインターフェースを実装したMockクラスを定義します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1bfcecef-d7f2-4ad3-bfe0-f50231419f30" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

import static org.junit.Assert.*;

public class MyLogicMock implements MyLogic {
    public int add(int lhs, int rhs) {
        // 要件１をちゃんと満たしているか確認
        assertEquals(100, lhs);
        assertEquals(200, rhs);

        return 1000; // 固定値を返す
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;このMockクラスは、引数が100と200がわたってきているか確認した後に、固定値で1000を返します。このMockクラスを使うように定義したspringbean.beans.MyServiceTest-context.xmlファイルを作成します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:96abde46-6300-447d-95ce-c0c347f3d070" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;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-2.5.xsd"&amp;gt;
    &amp;lt;!-- ロジックはMockを使う --&amp;gt;
    &amp;lt;bean id="logic" class="springbean.beans.MyLogicMock" /&amp;gt;
    &amp;lt;bean id="service" class="springbean.beans.MyServiceImpl"&amp;gt;
        &amp;lt;property name="logic" ref="logic" /&amp;gt;
        &amp;lt;property name="lhs" value="100" /&amp;gt;
        &amp;lt;property name="rhs" value="200" /&amp;gt;
    &amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;テストクラスのセットアップで、この定義ファイルを読み込んでApplicationContextを作ってserviceを取得します。&lt;br&gt;そして、取得したserviceに対してテストを実施します。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c4d259cc-4da2-4a96-a24a-80235c44a220" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.Assert.*;

public class MyServiceTest {

    private MyService service;

    @Before
    public void setUp() {
        // テスト用の定義ファイル読み込み
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "springbean/beans/MyServiceTest-context.xml");
        service = (MyService) ctx.getBean("service");
    }

    @After
    public void tearDown() {
        service = null;
    }

    @Test
    public void execute() throws Exception {
        // 要件２を満たしているか確認
        assertEquals(1000, service.execute());
    }
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;といった感じにクラス間が疎結合になり、単体テストがとてもやりやすくなるのがDIコンテナのメリットの１つでもあります。&lt;/p&gt;
&lt;p&gt;今回の例では、単純すぎてあんまりメリットは感じないですが、たとえばMyLogicがDBにアクセスするような処理だったら、Mockに簡単に差し替えることでDBに依存しないでMyServiceのテストが出来るということは大きなメリットになると思います。&lt;/p&gt;
&lt;p&gt;ということで今回はおしまい。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168168.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework 2.5入門 「依存性の注入」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/13/168090.aspx</link><pubDate>Fri, 13 Feb 2009 13:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/13/168090.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168090.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/13/168090.aspx#Feedback</comments><slash:comments>524</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168090.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168090.aspx</trackback:ping><description>&lt;p&gt;Spring FrameworkはIoCコンテナとかDIコンテナとか言われています。&lt;br&gt;要は、今までコードの中に書いてたクラス間の依存関係をSpring側で面倒見てあげるというものです。&lt;/p&gt; &lt;p&gt;代償としてXMLファイルを書かなければなりません。（新機能とか色々使えばそうでもないけど）&lt;br&gt;ということで、今回は依存性の注入をしてみようと思います。&lt;/p&gt; &lt;p&gt;依存性の注入方法には、代表的なもので２つあります。他にもありますが、とりあえず基本的なパターンでよく使うと思われる２つに絞ります。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;セッターインジェクション&lt;/li&gt; &lt;li&gt;コンストラクタインジェクション&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;名前からわかるように、各々セッターを使ってクラスのインスタンスを設定するか、コンストラクタで設定するかの違いです。&lt;br&gt;Spring的には、セッターインジェクションがオススメみたいなことが書いてありました。&lt;br&gt;（英語力が皆無なので誤読してる可能性あり）&lt;/p&gt; &lt;p&gt;なんでも、「理想を語るならコンストラクタインジェクションだけど、セッターインジェクションの方が色々便利だよ」と言う事らしいです。&lt;br&gt;詳しくは、Springのリファレンスを見てください。&lt;/p&gt; &lt;p&gt;ということで、今回はspring2bean.beans.MyServiceクラスとspring2bean.beans.MyLogicクラスを使って依存性注入をしてみようと思います。&lt;br&gt;MyServiceクラスがMyLogicクラスを使うといった形になっています。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;MyServiceクラス&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e37edafc-631f-4145-b18e-1ea1fb4d355d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package spring2bean.beans;

// 左辺値と右辺値を受け取ってMyLogicのaddメソッドに渡すだけのクラス
public class MyService {
    private MyLogic logic;

    private int lhs;
    private int rhs;

    public MyService() {
    }

    // コンストラクタで初期化
    public MyService(MyLogic logic, int lhs, int rhs) {
        this.logic = logic;
        this.lhs = lhs;
        this.rhs = rhs;
    }

    public int execute() {
        return logic.add(lhs, rhs);
    }

    // セッターでも初期化可能
    public void setLogic(MyLogic logic) {
        this.logic = logic;
    }

    public void setLhs(int lhs) {
        this.lhs = lhs;
    }

    public void setRhs(int rhs) {
        this.rhs = rhs;
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;MyLogicクラス&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:733b8a3a-3742-41f8-b268-0ce3c8ee17e3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package spring2bean.beans;

public class MyLogic {
    public int add(int x, int y) {
        return x + y;
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;MyServiceクラスには、コンストラクタからでもセッターからでもフィールドの値の設定が可能なつくりにしました。&lt;br&gt;このクラスを使って、コンストラクタインジェクションとセッターインジェクションの場合の定義例を以下に示します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;application.xml&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0916d792-9217-45b5-889e-9b1bbbdf8e43" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;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-2.5.xsd"&amp;gt;
    &amp;lt;!-- サービスから使われるロジック --&amp;gt;
    &amp;lt;bean id="myLogic" class="spring2bean.beans.MyLogic" /&amp;gt;

    &amp;lt;!-- セッターインジェクション --&amp;gt;
    &amp;lt;bean id="setterService" class="spring2bean.beans.MyService"&amp;gt;
        &amp;lt;!--
        propertyタグを使って、どのプロパティに何をセットするかを記述する。
        refを使って既に定義されているbeanを参照することも、valueを使って
        intやString等を直接設定することが出来る。
        --&amp;gt;
        &amp;lt;property name="logic" ref="myLogic" /&amp;gt;
        &amp;lt;property name="lhs" value="100" /&amp;gt;
        &amp;lt;property name="rhs" value="200" /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- コンストラクタインジェクション --&amp;gt;
    &amp;lt;bean id="constructorService" class="spring2bean.beans.MyService"&amp;gt;
        &amp;lt;!--
        constructor-argタグを使って、何番目のコンストラクタの引数に何を設定するかを
        指定する。
        propertyタグと同じようにrefとvalueが使える。
        こっちはpropertyタグにはないtype属性があって、そこに型を指定できる。
        --&amp;gt;
        &amp;lt;constructor-arg ref="myLogic" /&amp;gt;
        &amp;lt;constructor-arg type="int" value="1000" /&amp;gt;
        &amp;lt;constructor-arg type="int" value="150" /&amp;gt;
    &amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;簡単な説明をXML中にコメントとして追加しました。これを読み込んでサービスの処理を実行するMainを書いて動きを見てみます。うまくいけば、setterServiceのexecuteは300を返して、constructorServiceのexecuteは1150を返すはずです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Main.java&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d39ccb35-a58e-4467-825a-db628e491ebb" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package spring2bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring2bean.beans.MyService;

public class Main {

    public static void main(String[] args) {
        // ApplicationContext作って～
        ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
        
        // サービスのインスタンスを取得して～
        MyService setterService = (MyService) ctx.getBean("setterService");
        MyService constructorService = (MyService) ctx.getBean("constructorService");

        // 処理実行！
        System.out.println("setterService#execute = " + setterService.execute());
        System.out.println("constructorService#execute = " + constructorService.execute());
    }

}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行結果は…&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3ea5ed55-9b57-4d55-baae-e9b8ec3e020e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="sql"&gt;setterService#execute = 300
constructorService#execute = 1150&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;思ったとおり！&lt;/p&gt;
&lt;p&gt;今回のを簡単にまとめると・・・&lt;br&gt;依存性の注入にはセッターインジェクションとコンストラクタインジェクションの2通りがある。&lt;br&gt;セッターインジェクションにはpropertyタグを使う。&lt;br&gt;コンストラクタインジェクションにはconstructor-argタグを使う。&lt;br&gt;ref属性で、既に定義されているbeanを参照できて、value属性で直接値を設定できる。&lt;/p&gt;
&lt;p&gt;ということで今回はここまで。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168090.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Java]Spring Framework入門 「beanの登録」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/02/13/168064.aspx</link><pubDate>Fri, 13 Feb 2009 00:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/02/13/168064.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/168064.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/02/13/168064.aspx#Feedback</comments><slash:comments>338</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/168064.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/168064.aspx</trackback:ping><description>&lt;p&gt;前回：&lt;a href="http://blogs.wankuma.com/kazuki/archive/2009/02/12/168024.aspx"&gt;[Java]Spring Framework 2.5入門 「コンテナの作成」&lt;/a&gt;&lt;/p&gt; &lt;p&gt;前回で、application.xmlファイルを準備して、それを読み込んでApplicationContextを作ることが出来るようになりました。&lt;br&gt;今回は、このファイルにbeanを登録してみようと思います。&lt;/p&gt; &lt;p&gt;まず、プロジェクトの下準備をします。&lt;br&gt;NetBeansでspringbeanという名前のプロジェクトを作成し、application.xmlという名前でSpring XML 構成ファイルを作成します。&lt;/p&gt; &lt;p&gt;そして、Greeterというクラスをspringbean.beansパッケージに作成します。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:aa038de3-7d2c-4e9c-b4ef-c872e7f9d2a2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean.beans;

public class Greeter {
    public void greet() {
        System.out.println("Greeter#greet()");
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;この時点のプロジェクトウィンドウの画像を以下に示します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/JavaSpringFrameworkbean_D56/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="153" alt="image" src="http://kazuki.wankuma.com/images/2009/JavaSpringFrameworkbean_D56/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;application.xmlにここで作成したGreeterを登録します。&lt;br&gt;Springへのクラスの登録は、beanタグを使用します。&lt;/p&gt;
&lt;p&gt;beanタグには、以下のような属性が定義できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;class&lt;br&gt;クラス名（パッケージ名ふくむ）&lt;/li&gt;
&lt;li&gt;name&lt;br&gt;Springから登録されたクラスを取得するために必要な名前&lt;/li&gt;
&lt;li&gt;scope&lt;br&gt;prototypeやsessioon, request, singletonなんかを指定します&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;基本的にこれくらい知ってれば、とりあえずは大丈夫です。ということで、Greeterクラスを登録します。&lt;br&gt;以下のタグをapplication.xmlのbeansタグの中に書けばOK。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3e865c41-0b63-450d-b30d-5be42b63bef3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;bean name="greeter" class="springbean.beans.Greeter" /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;最後に、ここで定義したbeanを取り出す方法について述べます。取り出し方は、ApplicationContextのgetBeanで可能です。&lt;br&gt;beanタグのnameに指定したもので取り出すことが出来ます。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c7e35c33-11fe-49e8-92ea-ae7c8a8d90f8" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="java"&gt;package springbean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springbean.beans.Greeter;

public class Main {

    public static void main(String[] args) {
        // application.xmlをもとにSpringのコンテナを作成する。
        ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");

        // Greeterのインスタンスの取得
        Greeter g = (Greeter) ctx.getBean("greeter");
        g.greet();
    }

}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;今日はここまで！&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/168064.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>