2016-10-11 5 views
0

私は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に格納し、必要に応じてキャッシュから呼び出したいという理由があります。

答えて

0

このようなgetterメソッドを作成します。そして、あなたがリスナーのインスタンスを作成し、任意のクラスからオブジェクトを取得することができます

public MyObject getMyObject() 
{ 
     return myObjectInstance; 
} 

を。リスナーのインスタンスを作成しないクラスに取り込む必要がある場合は、リクエストしているクラスが、そのクラス(...)を参照できるクラスへの参照を持っている限り、これを使用することができますリスナーのインスタンスへのアクセス。

:あなたがオブジェクトを必要とし、リスナーをインスタンス化するクラスのインスタンスを持つクラスを持っていた場合

たとえば、あなただけのリスナーとそれを作成したクラスの両方の内側getterメソッドを作成することができますリスナーを作成したクラスで

public MyObject getMyObject() 
{ 
    return myObject; 
} 

:リスナーで

public MyObject getMyObjectFromListener() 
{ 
     return listenerInstance.getMyObject(); 
} 

それは汚いですが、それは動作するはずです。

+0

user2465510 - 私はリスナーからオブジェクトを取得するクラスのMyInitializationListener listenerInstance = new MyInitializationListener()としてlistenerInstanceを作成します。しかし、それが可能な限り最良の方法です。アドバイスをしてください。 – javaUser

+0

addListener()メソッドなど、リスナーのインスタンスを作成する必要がありますか?それから、私はそれがうまくいくと思う。私は実際にサーブレットに精通していないので、どのように動作するのか100%確信していません。 – user2465510

0

あなたはSpringを使用しているので、適切な方法はCacheManagerまたはCacheを適切なSpring Beanにすることです。

これが達成されると、ServletContextListenerであろうと、DAO実装であろうと、それらを必要とする場所に注入することができます。

関連する問題