|
♦日志服務(wù)對(duì)象工廠類 SimpleLogServiceFactory.java
package xyz.serviceprovider;
import java.util.Hashtable;
import javax.naming.Context; import
javax.naming.Name; 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客戶端 最后,我們?cè)贘NDI應(yīng)用package(xyz.jndi)中實(shí)現(xiàn)一個(gè)JNDI容器
JNDIContainer和一個(gè)JNDI客戶端應(yīng)用JNDIClient。 JNDIContainer在內(nèi)部使用文件系統(tǒng)服務(wù)提供者
fscontext來(lái)提供命名和目錄服務(wù),配置文件JNDIContainer.properties是服務(wù)注入場(chǎng)所,供配置DBService和
LogService實(shí)現(xiàn)。
♦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:\下創(chuàng)建sample目錄。 ctx=new
InitialContext(env); loadServices(); } //從配置文件
JNDIContainer.properties中讀取DBService和LogService實(shí)現(xiàn),綁定到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客戶端使用標(biāo)準(zhǔn)JNDI接口訪問(wèn)命名服務(wù)。 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(); } } }
至此,我們的整個(gè)Java SE應(yīng)用已經(jīng)完成。下面是整個(gè)應(yīng)用的源代碼結(jié)構(gòu)(Eclipse工程):
|