Лучший способ вызвать объект, созданный в классе слушателя, в других частях приложения

#java #jakarta-ee #ehcache

#java #джакарта-ee #ehcache

Вопрос:

Я работаю над приложением, разработанным с использованием Servlet и spring. Ниже приведен код, за которым следует описание.

 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

      }
  

Выше приведен мой класс слушателя, который загружается при запуске сервера. Я создал объект ehcache в вышеупомянутом классе. Мое требование выглядит следующим образом:

Подключитесь к базе данных и получите значение. Сохраните значение в кэше, чтобы любой дальнейший запрос к этому значению извлекался из кэша, а не из базы данных. Но проблема заключается в том, что когда указанный выше прослушиватель инициализируется во время запуска сервера, мои другие XML-файлы, в которых я настроил источники данных, еще не запущены.Поэтому я не могу написать какую-либо логику базы данных в своем классе слушателя. Чтобы решить эту проблему, я должен написать логику базы данных в другом классе, и этот класс присутствует в других пакетах.

 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 и вызывать его из кэша всякий раз, когда это требуется.

Ответ №1:

Создайте метод получения, подобный этому:

 public MyObject getMyObject()
{
        return myObjectInstance;
}
  

Тогда вы сможете получить объект из любого класса, который создает экземпляр прослушивателя. Если вам нужно поместить его в класс, который не создает экземпляр прослушивателя, вы все равно можете использовать это, если запрашивающий класс имеет ссылку на класс, который может ссылаться на класс (…), который имеет доступ к экземпляру прослушивателя.

Например, если у вас есть класс, которому нужен объект, и у него есть экземпляр класса, который создал экземпляр прослушивателя, вы можете просто создать метод получения как внутри прослушивателя, так и в классе, который его создал:

В слушателе:

 public MyObject getMyObject()
{
   return myObject;
}
  

В классе, который создал прослушиватель:

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

Это грязно, но должно работать.

Комментарии:

1. пользователь2465510 — Итак, вы хотите, чтобы я создал listenerInstance как: MyInitializationListener listenerInstance = new MyInitializationListener () в классе, где я хочу получить объект от слушателя. Но не уверен, что это наилучший возможный способ следовать.. Пожалуйста, посоветуйте.

2. Вам нужно создать экземпляр прослушивателя, например, для метода addListener()? Тогда я думаю, что это должно сработать. Я не очень хорошо знаком с сервлетами, поэтому я не уверен на 100%, как это работает.

Ответ №2:

Поскольку вы используете Spring, правильный способ — создать CacheManager или Cache правильные компоненты Spring.

Как только это будет достигнуто, вы сможете внедрить их в те места, которые их требуют, будь то реализация a ServletContextListener или вы DAO.