Java 如何在ApacheTomcat启动程序中创建单例
我需要在ApacheTomcat启动时创建一个单例,以便可以使用servlet访问它们。singleton定义servlet将给出什么样的响应 我想知道tomcat是否有一个构造函数,这样我就可以添加代码,这样就可以创建singleton了 *编辑:在搜索了一点之后,我发现我可以尝试使用web服务(JAX-WS)。 不过,我不知道jvm如何处理web服务中的实例。我可以在到WS的不同连接上访问同一对象吗 我使用BMargiles解决方案将这些资源添加到web.xml描述符:Java 如何在ApacheTomcat启动程序中创建单例,java,web-services,apache,constructor,singleton,Java,Web Services,Apache,Constructor,Singleton,我需要在ApacheTomcat启动时创建一个单例,以便可以使用servlet访问它们。singleton定义servlet将给出什么样的响应 我想知道tomcat是否有一个构造函数,这样我就可以添加代码,这样就可以创建singleton了 *编辑:在搜索了一点之后,我发现我可以尝试使用web服务(JAX-WS)。 不过,我不知道jvm如何处理web服务中的实例。我可以在到WS的不同连接上访问同一对象吗 我使用BMargiles解决方案将这些资源添加到web.xml描述符: <resour
<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>
创建单例“工厂”:
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中的get函数:
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调用这些方法而不创建新的InitialContext()
编辑:因为新的InitialContext()并不昂贵,所以我用这种方式来做,它对我来说非常好阅读Tomcat中的JNDI配置。文件是。可以在查找时定义一次要创建的对象 或者,您可以定义侦听Servlet上下文初始化事件的。当servlet初始化时,您可以创建对象并将其存储在servlet上下文中。您的每个servlet都可以通过servlet上下文访问并使用该对象 或者,您可以使用启动servlet,使用web.xml中定义的
1
初始化单例 好的,我已经创建了一个初始上下文。那么我如何从其他servlet调用我的Singleton呢?新的InitialContext()会消耗大量内存,对吗?不,不会太多。关于如何在server.xml上配置您的singleton以及如何将其从上下文中删除,您必须遵循其余的说明。好的,我正在成功地创建大量上下文并从中获取我的singleton。谢谢你再做一个初始上下文。它们并不昂贵。或者在注释@WebServlet(urlPatterns=“/my_servlet”,loadOnStartup=1)
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);
}
}
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();
}