Как делегировать создание некоторых классов из инжектора Guice в другой factory?

Например, класс RESTEasy ResteasyWebTarget имеет метод proxy(Class<T> clazz), как и Injector getInstance(Class<T> clazz). Есть ли способ сказать Гису, что создание некоторых классов должно быть делегировано в какой-то экземпляр?

Моя цель - следующее поведение Guice: когда инжектору предлагается новый экземпляр класса A, попробуйте его создать; если инстанцирование невозможно, попросите другой объект (например, экземпляр ResteasyWebTarget) создать экземпляр класса.

Я бы хотел написать такой модуль:

@Override
protected void configure() {
    String apiUrl = "https://api.example.com";
    Client client = new ResteasyClientBuilder().build();
    target = (ResteasyWebTarget) client.target(apiUrl);

    onFailureToInstantiateClass(Matchers.annotatedWith(@Path.class)).delegateTo(target);
}

вместо

@Override
protected void configure() {
    String apiUrl = "https://api.example.com";
    Client client = new ResteasyClientBuilder().build();
    target = (ResteasyWebTarget) client.target(apiUrl);

    bind(Service1.class).toProvider(() -> target.proxy(Service1.class);
    bind(Service2.class).toProvider(() -> target.proxy(Service2.class);
    bind(Service3.class).toProvider(() -> target.proxy(Service3.class);
}

Я думал о внедрении интерфейса Injector и использовал эту реализацию в качестве дочернего инжектора, но интерфейс имеет слишком много методов.

I может написать метод, перечисляющий все аннотированные интерфейсы в каком-то пакете и предлагая Guice использовать провайдер для них, но это подход резервного копирования.

Ответ 1

Guice не поддерживает это, у него нет крючков для прослушивания. Перехваты, которые он предоставляет (ProvisionListener и TypeListener), не вызываются, если привязка не может быть найдена.

Я могу написать метод, перечисляющий все аннотированные интерфейсы в каком-то пакете и предлагая Guice использовать провайдер для них, но это подход к резервному копированию.

Это ваш единственный вариант. Необязательные инъекции работают только в том случае, если вы готовы распространять свою любовь target.proxy по всей кодовой базе.

EDIT (2017-02-28). Если вы собираетесь это сделать, я уже сделал основы, чтобы сделать это частью моей проект magic-provider-guice, примеры для JDBI и Feign.

реализация интерфейса инжектора и использование этой реализации в качестве дочернего инжектора

Я не верю, что вы можете установить дочерний инжектор (просто создайте Guice с набором модулей), так что это тоже не сработает.