Использование Java SPI В Проекте Без Открытого Исходного Кода [На Базе Компании]

#java #api #service-provider

Вопрос:

Я недавно узнал о Java SPI, и я думаю, что это полезно только для сторонней библиотеки для реализации интерфейса, например slf4j , и jdbc [т. Е., скорее всего, библиотека с открытым исходным кодом]. Это также может быть полезно, если приложение является продуктом, в котором оно позволяет конечному пользователю создавать пользовательскую реализацию sth.

Но для разработки программного обеспечения в компании, где мы предоставляем API только клиенту, а конечные клиенты никогда не имеют права настраивать какую-либо реализацию, есть ли какие-либо причины для реализации интерфейса с использованием Java SPI?

Например, допустим, я работаю над платежной системой, где она напрямую подключается к другой банковской системе [например, Morgan Stanley, Bank Of China, Deutsche Bank…], но у каждой системы определенно будет свой API, и, возможно, нашему серверу необходимо по-разному обрабатывать запрос и ответ. Поэтому мы должны создать API для обертывания такой информации, чтобы другому разработчику, вызывающему такие сервисы, не нужно было беспокоиться о разнице между различными банковскими системами.

 public interface PaymentInterface {
     String bankName();
     
     boolean pay(Customer customer, BigDecimal amount);
}
 

В таком сценарии я могу в той же банке создать метод, который реализует интерфейс напрямую, а затем создать статический заводской метод для выбора различных интерфейсов платежей на лету. Тогда хорошо идти.

И, конечно, можно создать SPI и определить файл xxx META-INF/service, чтобы указать, что мы реализуем SPI в XXX и YYY. Но когда нельзя предвидеть, что будущая реализация SPI будет построена на внешней jar, но в той же jar. Есть ли какие-либо причины использовать SPI?

Позвольте мне еще раз перефразировать свои вопросы,

редко ли Java SPI используется программистами / компаниями? Если только вы не занимаетесь проектами с открытым исходным кодом, например spring dubbo , slf4j ?