♦日志服务对象工厂类 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客户端 最后,我们在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工程):
|