我如何在Apache Tomcat启动中创build一个单例

我需要在Apache Tomcat启动时创build一个单例,以便我可以使用servlet访问它们。 单例定义了servlet会给出什么样的响应。

我想知道是否tomcat有一个构造函数,所以我可以添加代码,以便可以创build单例。

*编辑:search一下后,我发现我可以尝试使用Web服务(JAX-WS)。 我不知道jvm如何对待web服务中的实例。 我可以通过不同的WS连接访问同一个对象吗?

我使用bmargulies解决scheme将这些资源添加到web.xml描述符中:

<resource-env-ref> <description> Factory for the Arduino Connection </description> <resource-env-ref-name> arduino/ArduinoConnectionFactory </resource-env-ref-name> <resource-env-ref-type> br.com.evans.jndi.basic.ArduinoConnection </resource-env-ref-type> </resource-env-ref> 

这个到context.xml

 <Context> <Resource name="arduino/ArduinoConnectionFactory" auth="Container" type="br.com.evans.jndi.basic.ArduinoConnection" factory="br.com.evans.jndi.basic.ArduinoConnectionFactory"/> </Context> 

创build单身人士课程:

 public enum ArduinoConnection implements SerialPortEventListener { INSTANCE; public void initialize() {...} } 

创build单身“工厂”:

 public class ArduinoConnectionFactory implements ObjectFactory { public ArduinoConnectionFactory() { ArduinoConnection.INSTANCE.initialize(); try { Thread.sleep(1800); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Object getObjectInstance(Object obj, Name name, Context nameCtx,Hashtable environment) throws NamingException { // Return the customized instance return (ArduinoConnection.INSTANCE); } } 

最后这个在servlet中获得一个函数:

  Context initCtx; try { initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); ArduinoConnection arduino = (ArduinoConnection) envCtx.lookup("arduino/ArduinoConnectionFactory"); arduino.doSomething(); } catch (NamingException e) { System.out.println("Something went wrong!"); e.printStackTrace(); } 

我现在的问题是知道如何从另一个servlet调用这些方法,而不需要创build一个新的InitialContext()

编辑:由于新的InitialContext()不是很贵,我正在这样做,它对我来说工作得非常好

阅读Tomcat中的JNDI配置。 文档在这里 。 你可以定义一个被创建的对象,一旦被查找。

或者,您可以定义一个监听Servlet上下文初始化事件的Servlet监听器 。 当初始化servlet时,可以创建对象并将其存储在Servlet上下文中。 每个servlet都可以通过servlet上下文访问这个对象并使用它。

或者,您可以使用启动servlet通过web.xml中定义的<load-on-startup>1</load-on-startup>来初始化单例。