创建JNDI Binding
开发J2EE程序时候,最让人头疼的莫过於各种各样的JNDI Binding,用得最多的一个类型要算DataSource,某些应用服务器上还有邮件服务、目录服务等等。
J2EE程序使用起来十分简单灵活,把服务器安装好然後把J2EE程序上传上去就可以了,比起PHP程序来要简单得多,但是在开发和测试时就要遇到各类名目繁多的概念和封装。一些非EJB项目,例如用Spring组织的项目,为了提高速度往往需要用一些静态变量,但是这些静态变量在程序装载和卸除时经常会出现一些奇怪的问题。
解决这些问题颇费周折,最好的方法莫过於把业务逻辑拿到应用服务器之外编写和测试,但是应用服务器一般都自带大量强大的JNDI资源,废弃不用的话产品会丢失不少卖点,将其模拟下来是最好的方法。一个项目甚至项目里的每个模块,在开发前期做好测试计划都是很有必要的,但这个话题太大了,这里写不了,我这里只写一些关於自己创建JNDI Binding的内容。
自己创建JNDI Binding需要建一大堆模型,至少需要InitialContextFactoryBuilder、InitialContextFactory和Context这三个,不可谓不复杂,但是其机制并不繁琐,只是想得周全一些罢了,例子代码如下:
package testjndi;import java.util.Hashtable;import javax.naming.Binding;import javax.naming.Context;import javax.naming.Name;import javax.naming.NameClassPair;import javax.naming.NameParser;import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.spi.InitialContextFactory;import javax.naming.spi.InitialContextFactoryBuilder;import javax.naming.spi.NamingManager;/** * * @author */public class CustomizedInitialContextFactoryBuilder implements InitialContextFactoryBuilder { public static void initialize() { try { // 覆盖原先的设置 NamingManager.setInitialContextFactoryBuilder( new CustomizedInitialContextFactoryBuilder()); }catch(Exception e) { e.printStackTrace(System.err); } } public InitialContextFactory createInitialContextFactory (Hashtable<?, ?> environment) throws NamingException { return new MyCustomizedInitialContextFactory(); } private class MyCustomizedInitialContextFactory implements InitialContextFactory { public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException { CustomizedContext customizedContext = new CustomizedContext(); return customizedContext; } } private class CustomizedContext implements Context { public Object addToEnvironment(String propName, Object propVal) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void bind(Name name, Object obj) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void bind(String name, Object obj) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void close() throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Name composeName(Name name, Name prefix) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public String composeName(String name, String prefix) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Context createSubcontext(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Context createSubcontext(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void destroySubcontext(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void destroySubcontext(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Hashtable<?, ?> getEnvironment() throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public String getNameInNamespace() throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public NameParser getNameParser(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public NameParser getNameParser(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public NamingEnumeration<NameClassPair> list(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public NamingEnumeration<NameClassPair> list(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public NamingEnumeration<Binding> listBindings(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public NamingEnumeration<Binding> listBindings(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Object lookup(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Object lookup(String name) throws NamingException { // 在这里将JNDI名帮定到实际的内容上 if (name == null) { throw new NamingException("Name must not be null."); }else if(name.equals("Key")) { return "Value"; }else { throw new NamingException("Name "" + name + "" not found."); } } public Object lookupLink(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Object lookupLink(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void rebind(Name name, Object obj) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void rebind(String name, Object obj) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public Object removeFromEnvironment(String propName) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void rename(Name oldName, Name newName) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void rename(String oldName, String newName) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void unbind(Name name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } public void unbind(String name) throws NamingException { throw new UnsupportedOperationException("Not supported yet."); } }}
public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // 启动JNDI资源 CustomizedInitialContextFactoryBuilder.initialize(); try { InitialContext initialContext = new InitialContext(); System.out.println(initialContext.lookup("Key")); }catch(Exception e) { e.printStackTrace(System.err); } } }