グローバル変数代わりにJNDIつかってみる
どことなくJNDI使おうかなと思って、apacheのdirectory-namingを使ってみた。Tomcatの中でつかわれてるやつですな。
必要なもの
- directory-naming(http://directory.apache.org/)
- commons-logging(http://jakarta.apache.org/commons/logging/)
- J2SDK1.4のJNDIのドキュメント
大体こんな感じ。
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コンテナをルックアップするとかは普通なんだろうか?