Если вы не хотите, чтобы потребитель заботился о вызове стартапа. Вы можете делегировать свой стартовый код внутренне защищенному методу, который лениво инициализирует то, что вы в данный момент делаете при запуске. Такие как:
protected MyService getMyService() {
if(myService == null) {
myService = new MyServiceImpl();
myService.startup();
}
return idpPersistence;
}
Вызовите методы, подобные этому:
public String findByThis(String tag, String key) {
return getMyService().findThat(MyClass.class, column, key);
}
Это, конечно, имеет некоторые компромиссы. Если ваша служба стоит дорого при запуске, то первый вызывающий абонент хорошо воспримет этот удар первым.
Другой вариант - реализовать их с использованием статического блока {}, но, конечно, иногда это тоже не очень хорошо тестируется. Кроме того, вы выполняете процедуры запуска на объектной структуре, что иногда также нарушает шаблоны IOC. Я пошел с добавлением интерфейса службы, потому что клиенты были внутренними, и я хотел, чтобы все службы были инициализированы и готовы к запуску.