[Tomcat] Eine Bean in allen Web-Applikationen verwenden / sharen
Um ein und dieselbe Instanz einer Bean (oder eine Klasse) in alle Web-Anwendungen, die in einem Tomcat laufen, zu verwenden, muss man so vorgehen:
1. Eine Bean erstellen, die das Singleton-Pattern implementiert
2. Passende BeanFactory erstellen, die die Singleton-Instanz zurückgibt
3. Beides nach $tomcat_home/common kopieren
4. Die Bean als Resource in der server.xml des Tomcat hinzufügen
5. ResourceLink für die Factory in die context.xml des Tomcat einfügen
6. web.xml der Web-Anwendung anpassen
7. Bean-Instanz in Web-Anwendung laden
Die Details:
1. Eine Bean erstellen, die das Singleton-Pattern implementiert:
package de.littlelittle;
public class MyBean
{
private static MyBean instance;
public synchronized static MyBean getInstance()
{
if(instance == null)
{
instance = new MyBean();
}
return instance;
}
private MyBean()
{
// .. do constructor stuff
}
//.. more methods
}
2. Passende BeanFactory erstellen, die die Singleton-Instanz zurückgibt:
package de.littlelittle;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingException;
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 = MyBean.getInstance();
// Return the customized instance
return (bean);
}
}
3. Beides nach $tomcat_home/common/classes (oder wenn die Klassen in eine jar gepackt sind: $tomcat_home/common/lib) kopieren.
4. Die Bean als Resource in der server.xml des Tomcat hinzufügen (in $tomcat_home/conf), innerhalb des Elements <GlobalNamingResources>
:
<Resource name="bean/myBeanFactory" auth="Container"
type="de.littlelittle.MyBean"
factory="de.littlelittle.MyBeanFactory" />
5. Folgende Zeile in der context.xml des Tomcat (in $tomcat_home/conf) hinzufügen:
<ResourceLink name="bean/myBeanFactory" global="bean/myBeanFactory" />
6. In der web.xml der Web-Anwendung, die die Instanz dieser Bean nutzen soll:
<resource-env-ref>
<description>Object factory for MyBean instance.</description>
<resource-env-ref-name>bean/myBeanFactory</resource-env-ref-name>
<resource-env-ref-type>de.littlelittle.MyBean</resource-env-ref-type>
</resource-env-ref>
7. Bean-Instanz laden, z.B. innerhalb des Javacodes einer JSF-BackingBean:
try
{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean myBeanInstance = (MyBean) envCtx.lookup("bean/MyBeanFactory");
}
catch (NamingException e)
{
e.printStackTrace();
}
Bei Starten des Tomcats wird die Factory schon das erste Mal aufgerufen und somit die Instanz der Bean angelegt! Allen Anwendungen steht diese Instanz dann zur Verfügung.