Предполагая, что вы не хотите внедрять фреймворк, два варианта имеют смысл (на мой взгляд):
- определите ваш сервисный уровень, используя сессионные компоненты EJB без сохранения состояния. Вам нужен контейнер EJB.
- сделайте это как всегда на языках ОО, создайте интерфейс и соответствующую реализацию:
Определить интерфейс
public interface BusinessService {
abstract public BusinessObject performSomeOperation(SomeInput input);
}
И реализация
public class BusinessServiceImpl implements BusinessService {
public BusinessObject performSomeOperation(SomeInput input) {
// some logic here...
}
}
У вас есть несколько вариантов создания службы. Если вы начинаете с нуля с небольшого приложения, может быть достаточно просто создать экземпляр службы внутри вашего веб-приложения:
BusinessService service = new BusinessServiceImpl();
service.performSomeOperation(...);
Кстати: Позже вы можете захотеть провести рефакторинг и реализовать некоторые абстракции, связанные с созданием экземпляра Сервиса (шаблон Factory, внедрение зависимостей и т. Д.). Кроме того, в больших системах существует вероятность того, что вам потребуется разместить уровень сервиса в собственной инфраструктуре для масштабируемости, чтобы ваше веб-приложение связывалось с уровнем сервиса через открытый протокол, будь то RESTful или веб-сервисы.
Однако будущее выглядит так, что благодаря четко определенному интерфейсу, определяющему ваши бизнес-функции, вы сможете «легко» двигаться вперед в случае роста приложения.
Ответ на ваше обновление:
Я бы не реализовывал сам сервис в качестве слушателя, это не имеет смысла. Тем не менее, ваш пример кода кажется разумным, но вы должны различать Service (в данном случае DBAccessService
) и способ его создания / извлечения (слушатель). Реализованный вами слушатель играет роль ServiceLocator , который способен находить определенные сервисы. Если вы храните экземпляр вашей службы в контексте сервлета, вы должны напомнить, что реализация службы должна быть поточно-ориентированной.
Вы должны быть осторожны, чтобы не перегружать свой дизайн - сохраняйте его простым, пока вы не можете предвидеть дальнейшие, сложные требования. Если это еще не сложно, я предлагаю инкапсулировать реализацию, используя простой статический метод фабрики:
public final class ServiceFactory {
public static DBAccessService getDBAccessService() {
DBAccessService service = new DBAccessServiceImpl();
return service;
}
}
Для реализации ServiceFactory
доступны сложные альтернативы, и в настоящее время некоторые называют это анти-паттерном. Но до тех пор, пока вы не хотите начинать с внедрения зависимостей (и т. Д.), Это по-прежнему верное решение. Реализация сервиса DBAccessServiceImpl
доступна только в одном месте (на заводе). Как я упоминал ранее - следите за многопоточностью ... надеюсь, это поможет!