#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.