♦日志服務(wù)對象工廠(chǎng)類(lèi) 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客戶(hù)端
最后,我們在JNDI應用package(xyz.jndi)中實(shí)現一個(gè)JNDI容器JNDIContainer和一個(gè)JNDI客戶(hù)端應用JNDIClient。
JNDIContainer在內部使用文件系統服務(wù)提供者fscontext來(lái)提供命名和目錄服務(wù),配置文件JNDIContainer.properties是服務(wù)注入場(chǎng)所,供配置DBService和LogService實(shí)現。
♦JNDI容器類(lèi) 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實(shí)現,綁定到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客戶(hù)端 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客戶(hù)端使用標準JNDI接口訪(fǎng)問(wèn)命名服務(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();
}
}
}
至此,我們的整個(gè)Java SE應用已經(jīng)完成。下面是整個(gè)應用的源代碼結構(Eclipse工程):

聯(lián)系客服