Java技术回顾之JNDI(二):JNDI应用实例,Java技术文章,Java系列教程,Java
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java技术回顾之JNDI(二):JNDI应用实例,Java技术文
章,Java系列教程,Java
♦日志服务对象工厂类 SimpleLogServiceFactory.java
package xyz.serviceprovider;
import java.util.Hashtable;
import javax.naming.Context;
import ;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
public class SimpleLogServiceFactory implements ObjectFactory {
public Object getObjectInstance(Object obj, Name name, Context ctx,
Hashtable<?, ?> env) throws Exception {
if(obj instanceof Reference){
return new SimpleLogService();
}
return null;
}
}
4、 JNDI容器和JNDI客户端
最后,我们在JNDI应用package(xyz.jndi)中实现一个JNDI容器JNDIContainer和一个JNDI客户端应用JNDIClient。
JNDIContainer在内部使用文件系统服务提供者fscontext来提供命名和目录服务,配置文件JNDIContainer.properties是服务注入场所,供配置DBService和 LogService实现。
♦JNDI容器类 JNDIContainer.java
package xyz.jndi;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import xyz.service.DBService;
import xyz.service.LogService;
public class JNDIContainer {
private Context ctx=null;
public void init() throws Exception{
//初始化JNDI提供者。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/c:/sample"); //fscontext的初始目录,我们需要在c:\下创建sample目录。
ctx=new InitialContext(env);
loadServices();
}
//从配置文件JNDIContainer.properties中读取DBService和LogService实现,绑定到Context中。
private void loadServices() throws Exception{
InputStream
in=getClass().getResourceAsStream("JNDIContainer.properties");
Properties props=new Properties();
props.load(in);
//inject dbservice
String s=props.getProperty("DBServiceClass");
Object obj=Class.forName(s).newInstance();
if(obj instanceof DBService){
DBService db=(DBService)obj;
String[] ss=props.getProperty("DBServiceProperty").split(";"); for(int i=0;i<ss.length;i++)
db.setProperty(i, ss[i]);
ctx.rebind(props.getProperty("DBServiceName"), db);
}
//inject logservice
s=props.getProperty("LogServiceClass");
obj=Class.forName(s).newInstance();
if(obj instanceof LogService){
LogService log=(LogService)obj;
ctx.rebind(props.getProperty("LogServiceName"), log);
}
}
public void close() throws NamingException{
ctx.close();
}
public Context getContext(){
return ctx;
}
}
♦JNDI 容器配置文件 JNDIContainer.properties
//和 JNDIContainer.java文件位于同一目录
DBServiceName=DBService
DBServiceClass=xyz.serviceprovider.SimpleDBService
DBServiceProperty=mydb//192.168.1.2:8421/testdb;start
LogServiceName=LogService
LogServiceClass=xyz.serviceprovider.SimpleLogService
♦JNDI 客户端 JNDIClient.java
package xyz.jndi;
import javax.naming.Context;
import xyz.service.DBService;
import xyz.service.LogService;
public class JNDIClient {
public static void main(String[] args){
try{
JNDIContainer container=new JNDIContainer();
container.init();
//JNDI客户端使用标准JNDI接口访问命名服务。
Context ctx=container.getContext();
DBService db=(DBService)ctx.lookup("DBService");
System.out.println("db location is:"+db.getLocation()+",state is:"+db.getState());
db.accessDB();
LogService ls=(LogService)ctx.lookup("LogService");
ls.log("this is a log message.");
container.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
至此,我们的整个Java SE应用已经完成。
下面是整个应用的源代码结构(Eclipse工程):。