`
小嘴冰凉
  • 浏览: 448288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNDI学习

    博客分类:
  • jndi
阅读更多
首先,我来介绍一下JNDI服务中的Reference对象。
  一般来说,我们可以把一个对象注册到JNDI服务中,通过调用InitialContext的bind和rebind方法即可。这个被注册的对象,我们称之为“被引用对象”,它是驻扎在内存中的运行时对象。JNDI服务的功能不是仅限于此,它还可以注册各种资源,例如网络打印机。这类资源可不是内存中可以找到的运行时对象,所以它们不能直接注册到JNDI的命名空间中,而必须以某种间接的方式注册。以网络打印机为例,JNDI服务可以注册它的IP地址和端口,有了通信地址,总是可以访问到网络打印机的。
    在JNDI API的javax.naming包中,有一个Reference类,它就是代表这些网络打印机这类资源的。Reference对象包含一系列RefAddr对象,RefAddr对象就表示资源的通信地址。Reference对象中还包含被引用对象的类名和对象工厂的类名,当被引用对象被lookup的时候,对象工厂会实时创建被引用对象的实例。举个列子,如果客户需要通过JNDI去获得一个唯一的ID,那么我们在JNDI中注册一个IDFactory。这个工厂以递增的次序创建ID。当客户调用lookup方法获得ID的时候,每次得到的是不同的、唯一的ID。



http://blog.csdn.net/lldwolf/archive/2008/04/17/2299622.aspx 这篇文章比较好的介绍了Referencable、Reference等的用法。

BindedClass和BindedClassFactory

1.package lld.test.jndi;   
2.  
3.import javax.naming.NamingException;   
4.import javax.naming.Reference;   
5.import javax.naming.Referenceable;   
6.import javax.naming.StringRefAddr;   
7.  
8.public class BindedClass implements Referenceable    
9.{   
10.    public String value;    
11.       
12.    public BindedClass()   
13.    {   
14.    }   
15.       
16.    @Override  
17.    public Reference getReference() throws NamingException   
18.    {   
19.        Reference r = new Reference(this.getClass().getName(), BindedClassFactory.class.getName(), null);   
20.        r.add(new StringRefAddr("value", this.getValue()));   
21.        return r;   
22.    }   
23.  
24.    public String getValue()   
25.    {   
26.        return value;   
27.    }   
28.  
29.    public void setValue(String value)   
30.    {   
31.        this.value = value;   
32.    }   
33.  
34.}  



1.package lld.test.jndi;   
2.  
3.import java.util.Hashtable;   
4.  
5.import javax.naming.*;   
6.import javax.naming.spi.*;   
7.  
8.public class BindedClassFactory implements ObjectFactory   
9.{   
10.    @Override  
11.    public Object getObjectInstance(Object obj, Name name, Context nameCtx,   
12.            Hashtable<?, ?> environment) throws Exception   
13.    {   
14.        if(obj instanceof Reference)   
15.        {   
16.            Reference ref = (Reference)obj;   
17.            String val = (String)ref.get("value").getContent();   
18.            BindedClass o = new BindedClass();   
19.            o.setValue(val);   
20.            return o;   
21.               
22.        }   
23.        return null;   
24.    }   
25.}  




Referenable接口只有一个方法,就是getReference(),返回一个Reference对象,BindedClass只设了一个示例成员变量Value,存储一个字符串值,在创建Refernce对象时,要指定它引用的类名以及创建该类的工厂对象,JNDI Context在绑定该对象时就会将这些信息都存到文件中,将来从JNDI中取对象时可就全靠工厂对象根据文件中的内容重建BindedClass对象了。我这里提前把绑定后生成的文件内容说一下,大家会更有一个直观的印象,其内容如下所示:

bind1/RefAddr/0/Type=value
bind1/ClassName=lld.test.jndi.BindedClass
bind1/RefAddr/0/Encoding=String
bind1/FactoryName=lld.test.jndi.BindedClassFactory
bind1/RefAddr/0/Content=abcdefg大家看到了,前面在BindedClass.getReference()方法中使用了如下语句:

r.add(new StringRefAddr("value", this.getValue()));

就是定义要将这些信息存储到JNDI中呢,至于最后的“bind1/RefAddr/0/Content=abcdefg”,那是因为我在后面的示例Bind.java中将其值设成了“abcdefg”而已,呵呵。而BindedClassFactory.getObjectInstance()方法中

String val = (String)ref.get("value").getContent();

就是用来取到存储的值呢。




1.package lld.test.jndi;   
2.  
3.import java.util.Properties;   
4.  
5.import javax.naming.Context;   
6.import javax.naming.directory.DirContext;   
7.import javax.naming.directory.InitialDirContext;   
8.  
9.public class Bind   
10.{   
11.    public static void main(String[] args) throws Exception   
12.    {   
13.        Properties ps = new Properties();   
14.        ps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");   
15.        ps.setProperty(Context.PROVIDER_URL, "file:JNDI_REF");   
16.        DirContext ctx = new InitialDirContext(ps);   
17.        String key = "bind1";   
18.  
19.        BindedClass b = new BindedClass();   
20.        b.setValue("abcdefg");   
21.        ctx.rebind(key, b);   
22.  
23.        System.out.println("Binded successfully!");   
24.        ctx.close();   
25.    }   
26.}  





1.package lld.test.jndi;   
2.  
3.import java.util.Properties;   
4.  
5.import javax.naming.Context;   
6.import javax.naming.directory.DirContext;   
7.import javax.naming.directory.InitialDirContext;   
8.  
9.public class Lookup   
10.{   
11.    public static void main(String[] args) throws Exception   
12.    {   
13.        Properties ps = new Properties();   
14.        ps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");   
15.        ps.setProperty(Context.PROVIDER_URL, "file:JNDI_REF");   
16.        DirContext ctx = new InitialDirContext(ps);   
17.        String key = "bind1";   
18.        BindedClass o = (BindedClass)ctx.lookup(key);   
19.        System.out.println(o.getValue());       
20.           
21.        ctx.close();   
22.    }   
23.  
24.}  





http://esteem.iteye.com/blog/383499





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics