Каковы наилучшие методы использования ServiceLoader в среде с несколькими ClassLoaders? В документации рекомендуется создать и сохранить один экземпляр службы при инициализации:
private static ServiceLoader<CodecSet> codecSetLoader = ServiceLoader.load(CodecSet.class);
Это приведет к инициализации ServiceLoader с использованием текущего загрузчика классов. Предположим теперь, что этот фрагмент содержится в классе, загруженном с использованием совместно используемого загрузчика классов в веб-контейнере, и несколько веб-приложений хотят определить свои собственные реализации служб. Они не попадут в вышеупомянутый код, возможно, даже будет возможно, что загрузчик будет инициализирован с использованием первого загрузчика классов контекста webapps и предоставит неверную реализацию другим пользователям.
Всегда создание нового ServiceLoader кажется бесполезным, так как он должен каждый раз перечислять и анализировать служебные файлы. Изменить: Это может быть даже большая проблема с производительностью, как показано в этом ответе на реализацию java XPath.
Как другие библиотеки справляются с этим? Они кэшируют реализации для каждого загрузчика классов, каждый раз они пересматривают свою конфигурацию или просто игнорируют эту проблему и работают только для одного загрузчика классов?