今回の目標

  • Springアノテーションの使用の続き。
  • Abstractな親クラスをSpringアノテーションを記述する。
    • 親クラスのインスタンスが生成されないかチェックする。
    • 親クラスのメンバにインジェクションできるか確認する。

検証環境作成

設定ファイル

Bean定義ファイル(application.xml)
  • 前回と同じ。

プロパティファイル(config.properties)
  • この値をSpringを使ってインジェクションする。
### テスト ###
hoge.num=20
hoge.str=にゃーん
hoge.parent=親にゃーん
web.xml
  • 前回と同じ。

プログラムソース

TestController.java
  • 前回と同じ。
  • TestDIBeanをインジェクションする。

ParentBean,java
package jp.holenews.w2u.test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
// Abstractな親クラス
@Component
public abstract class ParentBean {
    // Abstractでもプロパティファイルから設定できる?
    @Value("${hoge.parent}")
    private String parentStr;
    
    private static int count = 0;
    
    public ParentBean(){
        // インスタンスが生成されるたびにインクリメント
        count++; 
    }
}
TestDIBean .java
package jp.holenews.w2u.test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.*;
// ParentBeanを親クラスに指定する
@Component
public class TestDIBean extends ParentBean{
	// 省略
}
TestServlet .java
package jp.holenews.w2u.test;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.ContextLoaderListener;
/**
 * テスト用サーブレット
 */
public class TestServlet extends HttpServlet {
	
	/**
	 * ※doGet以外は省略
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	      // アプリケーションコンテキストの取得
	      ApplicationContext contxt = ContextLoaderListener.getCurrentWebApplicationContext();
	      
	      // Beanの取得。getBeanの引数には頭を小文字にしたクラス名を指定。
	      TestController target = (TestController)contxt.getBean("testController");
	      // さらにTestControllerにインジェクションしたTestDIBeanを取得
	      TestDIBean bean = target.getTestDIBean();
	      // 親クラスの値を取得
	      String par = bean.getParentStr();
	      int count = bean.getCount();
	      
              // 結果を出力
	      response.setContentType("text/html; charset=UTF-8");
	      PrintWriter w = response.getWriter();
	      w.println(par);
	      w.println(count); // 値が1ならインスタンス化はTestDIBeanのときの1回のみで、ParentBeanはインスタンス化されてない
	}
}

結果確認

親にゃーん 1

結果考察

  • @Componentをつけても、Abstractなクラスはインスタンス化されない。
    • でもインジェクションはできる。
    • インジェクションした値は子クラスでも取得できる。

このページへのコメント

89FOM0 <a href="http://wmdrkrprqoaf.com/">wmdrkrprqoaf</a>, [url=http://kmdwlrwgcfoo.com/]kmdwlrwgcfoo[/url], [link=http://fdqpctaefsdn.com/]fdqpctaefsdn[/link], http://xgipwzvknuuv.com/

0
Posted by mjwnzc 2013年11月14日(木) 18:26:05 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます