Если я правильно понимаю, у вас есть что-то вроде
public class C {
}
public class A {
private C c;
public void setC(C c) {
this.c = c;
}
}
public class B {
private final C c;
public B() {
this.c = new C();
}
public C getC() {
return this.c;
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
A a = new A();
C c = b.getC();
a.setC(c);
}
}
Эта конструкция не соответствует принципам DI и должна быть реорганизована. Вы должны позволить Guice создать свой экземпляр C
. В этом случае вы будете иметь что-то вроде
public class C {
}
public class A {
private final C c;
@Inject
A(C c) {
this.c = c;
}
}
public class B {
private final C c;
@Inject
B(C c) {
this.c = c;
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector();
A a = injector.getInstance(A.class);
B b = injector.getInstance(B.class);
}
}
И здесь у вас есть C
автоматически вводится как в A
и B
.
Если вы действительно не может реорганизовать вам код, рассмотреть возможность использования поставщиков, то:
public class AProvider extends Provider<A> {
private final B b;
@Inject
AProvider(B b) {
this.b = b;
}
@Override
public A get() {
A a = new A();
C c = b.getC();
a.setC(c);
// Or, better
// A a = new A(b.getC());
return a;
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(A.class).toProvider(AProvider.class);
}
});
A a = injector.getInstance(A.class);
}
}
В этом случае поставщик используется для создания A
и установить его C
зависимость.
Но иногда даже этого недостаточно (например, когда ваше поведение B.getC()
зависит от пользовательского ввода). В этом случае вы должны использовать assisted inject расширения:
public interface AFactory {
public A create(C c);
}
public class A {
private final C c;
private final Other other;
@Inject
A(@Assisted C c, Other other) {
this.c = c;
this.other = other;
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AbstractModule() {
@Inject
protected void configure() {
install(new FactoryModuleBuilder()
.build(AFactory.class));
}
});
B b = injector.getInstance(B.class);
C c = b.getC(someUserInput);
AFactory af = injector.getInstance(AFactory.class);
A a = af.create(c);
}
}
В последнем примере два объекта будет впрыскивают в A
через af.create(c)
вызова: во-первых, что c
вы предоставили, и вторым, и экземпляр Other
класса, который является автоматически разрешается Guice. Другими словами, вспомогательная инъекция позволяет создавать экземпляры классов, которые будут иметь одну часть их зависимостей, разрешенных вами, а другая часть - от Guice.
'A' будет иметь свойство« obj ». – SJuan76
Как он узнает, что obj принадлежит к этому классу? –
Можете ли вы написать фрагмент кода и объяснить как ответ? pls –