私はServletとSpringを使用して開発されたアプリケーションに取り組んでいます。 以下にその説明が続くコードを示します。アプリケーションの他の部分でListenerクラスで作成されたオブジェクトを呼び出す最良の方法
package com.mymodule.listener;
import net.sf.ehcache.*;
//imports
public class MyInitializationListener implements ServletContextListener {
/** Singleton instance of CacheManager. */
private static CacheManager singletonManager = null;
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("--ServletContextListener destroyed*--");
}
private static CacheManager getInstance() {
if (singletonManager == null) {
singletonManager = CacheManager.create();
}
return singletonManager;
}
private Cache getCache() {
Cache cache = null;
cache = MyInitializationListener.getInstance().getCache("myCache");
return cache;
}
// Run this before web application is started
public void contextInitialized(ServletContextEvent arg0) {
final Cache cache = getCache();
//logic here
}
上記は、サーバーの起動後すぐにロードされるListenerクラスです。私は上記のクラスでehcacheオブジェクトを作成しました。私の要件は以下の通りです:
データベースに接続して値を取得します。 キャッシュに値を格納します。その値への以降の要求は、データベースヒットではなくキャッシュから取得されます。 しかし、上記のリスナーがサーバーの起動時に初期化されるとき、データソースを設定した他のXMLファイルはまだ開始されていません。私はListenerクラスにデータベースロジックを書き込めません。この問題を解決するには、データベースロジックを他のクラスに記述しなければならず、そのクラスは他のパッケージにも存在します。
package com.mymodule.dao.hibernate;
public class MyDAOImpl extends HibernateDaoSupport implements MyDAO {
public String getDataValue() throws DataLayerException {
//String SQL = "...";
//logic to connect to the database and get the value.
//here I want to get that ehcache object which was created after the server is started in MyInitializerListener class.
}
最良の方法とどのように異なるパッケージに存在するアプリケーションの他のクラスでehcacheをオブジェクトを取得することですどのお勧めしてください。データベーステーブルから返された値は、アプリケーションの多くの部分で使用されているので、その値をehcacheに格納し、必要に応じてキャッシュから呼び出したいという理由があります。
user2465510 - 私はリスナーからオブジェクトを取得するクラスのMyInitializationListener listenerInstance = new MyInitializationListener()としてlistenerInstanceを作成します。しかし、それが可能な限り最良の方法です。アドバイスをしてください。 – javaUser
addListener()メソッドなど、リスナーのインスタンスを作成する必要がありますか?それから、私はそれがうまくいくと思う。私は実際にサーブレットに精通していないので、どのように動作するのか100%確信していません。 – user2465510