グローバル変数代わりにJNDIつかってみる

どことなくJNDI使おうかなと思って、apacheのdirectory-namingを使ってみた。Tomcatの中でつかわれてるやつですな。

必要なもの

大体こんな感じ。

package sample.naming;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JavaCompSample {
	public static void main(String[] args){
		/*
		 * jndi.propertiesを使わない場合で且つ
		 * Hashtableを指定させたくないとき 
		 *
		 * System.setProperty(Context.URL_PKG_PREFIXES,"org.apache.naming");
		 * System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
		 * "org.apache.naming.java.javaURLContextFactory");
		 */
		
		/*
		 * Hashtableをつかうとき
		 * このときは他のInitialContextをnewするときにもこれを指定する
		 * Hashtable env = new Hashtable();
		 * env.put(Context.INITIAL_CONTEXT_FACTORY,
		 *         "org.apache.naming.java.javaURLContextFactory");
		 * env.put(Context.URL_PKG_PREFIXES,"org.apache.naming");
		 * InitialContext ctx = new InitialContext(env);
		 */
		try {
			InitialContext ctx = new InitialContext();
			Context compContext = ctx.createSubcontext("java:comp");
			Context envContext =  compContext.createSubcontext("env");
			envContext.bind("host", "www.apache.org");
			envContext.bind("port", new Integer(80));
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for(int i = 0; i < 5; i++){
			new JavaCompSample().lookupFromOtherCotext();
		}
	}

	private void lookupFromOtherCotext() {
		// TODO Auto-generated method stub
		try {
			InitialContext ctx = new InitialContext();
			String host = ctx.lookup("java:comp/env/host").toString();
			String port = ctx.lookup("java:comp/env/port").toString();
			System.out.println("host:"+host);
			System.out.println("port:"+port);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

この例ではHashtableを指定していないけど、それはクラスパスのとおっているところにプロパティファイル(jndi.properties)をおいているから。中身はこんな感じ

java.naming.factory.url.pkgs=org.apache.naming
java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory

まだ試してないけど、イベントリスナーとかも設定できるし、結構便利そう。
XMLから設定するクラスもついているので、xmlの設定ファイルの中でJNDIの設定させるのも楽そう。でも流行としてはDIコンテナなのかな。。。DIコンテナは全然追ってないけど、jndiからDIコンテナをルックアップするとかは普通なんだろうか?