jestem nowy w tej koncepcji, ale tutaj jest moje zrozumienie.
Załóżmy, że masz interfejsy A
i B
oraz implementacje Ai
i Bi
.
Jeśli Ai
ma zależność B
i Bi
ma zależność A
, następnie Guice może stworzyć realizację proxy A
(nazywają to Ap
), które w pewnym momencie w przyszłości zostać podany jest Ai
powierzyć. Guice podaje, że Ap
do jest zależny od A
, umożliwiając zakończenie instancji Bi
. Następnie, odkąd utworzono instancję Bi
, Guice może utworzyć instancję Ai
z Bi
. Następnie, od Ai
jest teraz dobrze zrobić, Guice mówi Ap
, aby delegować do Ai
.
Jeśli A
i B
nie były interfejsy (i po prostu trzeba Ai
i Bi
) to po prostu nie byłoby możliwe, gdyż wymagałoby tworzenia Ap
Ci przedłużyć Ai
, który już potrzebuje Bi
.
Oto, co to może wyglądać z kodem:
klasy
public interface A {
void doA();
}
public interface B {
void doB();
}
public class Ai implements A {
private final B b;
@Inject
public Ai(B b) {
this.b = b;
}
public void doA() {
b.doB();
}
}
public class Bi implements B {
private final A a;
@Inject
public Bi(A a) {
this.a = a;
}
public void doB() {
}
}
Pełnomocnik że Guice sprawia będzie wyglądać następująco:
public class Ap implements A {
private A delegate;
void setDelegate(A a) {
delegate = a;
}
public void doA() {
delegate.doA();
}
}
I to wszystko być podłączone przy użyciu tej podstawowej idei:
A oto, jak by to było, gdybyś miał tylko Ai
i Bi
, bez interfejsów A
i B
.
public class Ap extends Ai {
private Ai delegate;
public Ap() {
super(_); //a B is required here, but we can't give one!
}
}
Gdybym po prostu wyrzucić za sobą wystarczającą ilość interfejsów klas, będzie wszystko w porządku?
Przypuszczam, że istnieją ścisłe ograniczenia dotyczące sposobu interakcji proxy w konstruktorze. Innymi słowy, jeśli B spróbuje wywołać A zanim Guice ma szansę zaludnić proxy A z prawdziwym A, wówczas oczekiwałbym wyjątku RuntimeException.
ja też wolą tego podejścia. Oznacza to, że nie musisz tworzyć interfejsów, gdy nie będziesz ich potrzebować. Jest także szybsze/mniej potencjalnie niechlujne, aby zmienić wtrysk do dostawcy niż tworzyć interfejsy. – specialtrevor
Co powiesz na wyraźną zależność od 'Guice' w twoim kodzie aplikacji? Zawsze myślałem, że miło jest pozostać niezależnym od frameworka DI. Zanim wprowadziłeś 'Provider' do swojego kodu, mógłbyś przełączyć się na" Spring ", ale nie jest to już możliwe. –
Mówię o javax.inject.Provider, standardowym interfejsie JSR330. Nie jest wymagana zależność od guice. –