Я бы использовал ленивую инициализацию везде, где это называется.Локальное запоминание, если оно хорошо продумано, создает меньше хаоса, чем распределение его по нескольким классам.
Если вам нужно совместно использовать даже тогда, то ленивая статическая инициализация в для службы без сохранения состояния лучше, чем Singleton.Если кэширование / запоминание является локальным (и уместным), оно не нарушает «ментальную картину без сохранения состояния», которая помогает поддерживать чистоту кода.
Однако кеширование / запоминание - это трудная задача для тестирования.Но манипулирование bean-компонентами без сохранения состояния тривиально, и независимая проверка работы кеша также проста.