♦日志服務(wù)對象工廠類 SimpleLogServiceFactory.java
package xyz.serviceprovider;
import java.util.Hashtable;
import javax.naming.Context;
importjavax.naming.Name;
import javax.naming.Reference;
importjavax.naming.spi.ObjectFactory;
public class SimpleLogServiceFactory implementsObjectFactory {
publicObject getObjectInstance(Object obj, Name name, Context ctx,
Hashtable<?,?> env) throws Exception {
if(obj instanceof Reference){
returnnew SimpleLogService();
}
return null;
}
}
4、JNDI容器和JNDI客戶端
最后,我們在JNDI應(yīng)用package(xyz.jndi)中實現(xiàn)一個JNDI容器JNDIContainer和一個JNDI客戶端應(yīng)用JNDIClient。
JNDIContainer在內(nèi)部使用文件系統(tǒng)服務(wù)提供者fscontext來提供命名和目錄服務(wù),配置文件JNDIContainer.properties是服務(wù)注入場所,供配置DBService和LogService實現(xiàn)。
♦JNDI容器類 JNDIContainer.java
package xyz.jndi;
import java.io.InputStream;
importjava.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
importjavax.naming.InitialContext;
import javax.naming.NamingException;
import xyz.service.DBService;
importxyz.service.LogService;
publicclass JNDIContainer {
privateContext 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:\下創(chuàng)建sample目錄。
ctx=newInitialContext(env);
loadServices();
}
//從配置文件JNDIContainer.properties中讀取DBService和LogService實現(xiàn),綁定到Context中。
privatevoid loadServices() throws Exception{
InputStreamin=getClass().getResourceAsStream("JNDIContainer.properties");
Propertiesprops=new Properties();
props.load(in);
//injectdbservice
String s=props.getProperty("DBServiceClass");
Objectobj=Class.forName(s).newInstance();
if(obj instanceof DBService){
DBServicedb=(DBService)obj;
String[]ss=props.getProperty("DBServiceProperty").split(";");
for(inti=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(objinstanceof LogService){
LogService log=(LogService)obj;
ctx.rebind(props.getProperty("LogServiceName"),log);
}
}
public void close() throws NamingException{
ctx.close();
}
publicContext 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
packagexyz.jndi;
importjavax.naming.Context;
importxyz.service.DBService;
import xyz.service.LogService;
public class JNDIClient {
publicstatic void main(String[] args){
try{
JNDIContainercontainer=new JNDIContainer();
container.init();
//JNDI客戶端使用標(biāo)準(zhǔn)JNDI接口訪問命名服務(wù)。
Context ctx=container.getContext();
DBService db=(DBService)ctx.lookup("DBService");
System.out.println("db location is:"+db.getLocation()+",stateis:"+db.getState());
db.accessDB();
LogService ls=(LogService)ctx.lookup("LogService");
ls.log("this is a log message.");
container.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
}
至此,我們的整個Java SE應(yīng)用已經(jīng)完成。下面是整個應(yīng)用的源代碼結(jié)構(gòu)(Eclipse工程):