实现javax.naming.spi.ObjectFactory接口,该工场的功能是创建resource object对象。
import java.util.Enumeration; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.spi.ObjectFactory; public class MyBeanFactory implements ObjectFactory { public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws NamingException { // Acquire an instance of our specified bean class MyBean bean = new MyBean(); // Customize the bean properties from our attributes Reference ref = (Reference) obj; Enumeration addrs = ref.getAll(); while (addrs.hasMoreElements()) { RefAddr addr = (RefAddr) addrs.nextElement(); String value = (String) addr.getContent(); if (addr.getType().equals("foo")) { bean.setFoo(value); } else if (addr.getType().equals("bar")) { try { bean.setBar(Integer.parseInt(value)); } catch (NumberFormatException e) { throw new NamingException("Invalid 'bar' value " + value); } } } // Return the customized instance return (bean); } }
可以将jndi的资源配置到server.xml中的GlobalNamingResources 配置项中,例如:
<GlobalNamingResources> <Resource name="bean/cmsFileObservable" auth="Container" type="java.util.Observable" factory="com.koubei.cmsoptim.tomcat.extend.JspUpdateResourceFactory" /> </GlobalNamingResources>
http://tomcat.apache.org/tomcat-6.0-doc/config/globalresources.html
唯一的不方便的地方是在GlobalNamingResources中配置的resource资源在web应用的context中默认是不可见的,必须要使用
<Context> <ResourceLink name="bean/MyBeanFactory" global="bean/MyBeanFactory" type="com.mycompany.MyBean" /> </Context>
才能在web应用中引用到GlobalNamingResources定义的context对象,如果在每个web应用中都配置,那会比较麻烦,但是可以将ResourceLink 配置到%catalina.home%/conf/context.xml 这个配置文件中,这样所有web应用都能共享这个resource 对象了
<!-- The contents of this file will be loaded for each web application --> <Context> <ResourceLink name="bean/cmsFileObservable" global="bean/cmsFileObservable" type="java.util.Observable"/> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> </Context>
使用jndi容器中的对象
<%@page import="com.koubei.resource.MyBean" %> <%@page import="javax.naming.InitialContext" %> <%@page import="javax.naming.Context" %> <% Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); %> <%="foo = " + bean.getFoo() + ", bar = " + bean.getBar()%>