JNDI注入前置知识学习

客户端

和 RMI 类似但又不一样,由于 JNDI 有多种命名/目录提供形式,所以客户端需要 InitialContext 类来获取初始目录环境:

String url = "rmi://localhost:1099/hello";

InitialContext context = new InitialContext();

context.lookup(url);

JNDI 会根据 url 的形式来进行动态解析,比如对于以 RMI 形式提供的服务,url 就可以写成 rmi://{ip}:{port}/{name} ;对于 JDAP 的服务,url 可以写成 ldap://{ip}:{port}/name

Reference 类

对于不在命令/目录范围内的对象,可以通过 Reference 类来绑定一个外部的远程对象(一般以字节码形式通过 http 服务托管),客户端可以通过 lookup 方法查找到这个远程对象,获取相应的 factory,然后通过 factory 将 reference 转换为具体的对象。

Reference(String className) 
    为类名为“className”的对象构造一个新的引用。  
Reference(String className, RefAddr addr) 
    为类名为“className”的对象和地址构造一个新引用。  
Reference(String className, RefAddr addr, String factory, String factoryLocation) 
    为类名为“className”的对象,对象工厂的类名和位置以及对象的地址构造一个新引用。  
Reference(String className, String factory, String factoryLocation) 
    为类名为“className”的对象以及对象工厂的类名和位置构造一个新引用。  

通过 RMI 来绑定一个 Reference 对象:

String referenceUrl = "http://localhost:9999";
Registry registry = LocateRegistry.createRegistry(1099);
Reference reference = new Reference("refer", "refer", referenceUrl);
// 通过 ReferenceWrapper 包装
ReferenceWrapper refer = new ReferenceWrapper(reference);
registry.bind("refer", refer);

为什么需要 ReferenceWrapper 进行包装呢?

在 RMI 中提到过被 Registry 绑定的对象必须继承 UnicastRemoteObject 类,而 Reference 类并没有实现这个类,无法被直接绑定:

而 ReferenceWrapper 是实现了的,并且内部有一个 Reference 的引用:

所以需要包装一层,才能被 Registry 绑定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值