Я сомневаюсь, как реализовать внедрение зависимостей с помощью guice, когда существует несколько реализаций одного и того же интерфейса, и эта зависимость определяется во время выполнения на основе параметров, поэтому я приведу пример, чтобы легко объяснить мой вопрос:
Представьте себе сценарий, в котором у вас есть один модуль для загрузки файлов нескольких форматов, в основном у вас есть один интерфейс, определяющий контракт, и несколько реализаций по одному для каждого формата:
public interface FileLoader {
void load(File file);
}
public class YMLFileLoader{
void load(File file){
System.out.println("Loading YML");
}
}
public class XMLFileLoader{
void load(File file){
System.out.println("Loading XML");
}
}
Теперь во время выполнения необходимо определить на основе расширения файла реализацию, которая должна использоваться для его загрузки.
Моя идея поддерживать код в чистоте - использовать аннотации, для каждой реализации указывается, что она загружает через аннотацию @FileLoaderType.
@Singleton
@FileLoaderType("yml")
public class YMLFileLoader{
void load(File file)
{
System.out.println("Loading YML");
}
}
@Singleton
@FileLoaderType("xml")
public class XMLFileLoader{
void load(File file)
{
System.out.println("Loading XML");
}
}
Мой первый вопрос: возможна ли реализация?
Поскольку первый вопрос положителен, есть ли способ реализовать это решение, если для каждой новой реализации FileLoader не требуется рефакторинг в реализации AbstractModule, поддерживающей это решение?
Другими словами, в основном для каждой новой реализации FileLoader требуется только наличие аннотации @FileLoaderType, чтобы Guice знал, какую зависимость он должен внедрить, если расширение соответствует ей.