Как делегировать создание некоторых классов из инжектора 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 с набором модулей), так что это тоже не сработает.
Ответ 2
https://github.com/google/guice/wiki/Injections
Ознакомьтесь с дополнительными инъекциями, вы можете создать откат с этим.