Java Guice: Глубокая инъекция объекта - PullRequest
0 голосов
/ 05 июня 2018

У меня есть классы B, C и D. Сейчас я хочу добавить класс A, атрибуты которого полностью связаны со значениями в конфигурации приложения.Как лучше всего использовать Guice для ввода значений в класс A?

public class A {
    public A(@Named("id") String id, ..., @Named("attr") String attr) {
        ....
    }   
}

public class B {
    public B() {
        this.a = new A();
    }
}


 public class C {
    public C() {
         this.b = new B();
    }
 }

 public class D {

     @Inject
     private Injector injector;

     public D() {
          this.c = new C();
     }
 }

Одна из возможностей, о которой я могу подумать, - это продолжать передавать экземпляр Injector с D на B и менять B st:

public class B {
    public B(Injector injector) {
        this.a = injector.getInstance(A.class);
    }
}

Это кажется плохой формой, и я не видел онлайн примеров, использующих это.Любые предложения приветствуются.

1 Ответ

0 голосов
/ 05 июня 2018

вместо new 'ing A, B и C, почему бы не требовать их передачи в качестве зависимостей.что-то вроде этого:

class A {
    private final String id;
    private final String attr;

    @Inject
    A(String id, String attr) {
        this.id   = id;
        this.attr = attr;
    }
}

class B {
    private final A a;

    @Inject
    B(A a) {
        this.a = a;
    }
}


class C {
    private final B b;

    @Inject
    C(B b) {
        this.b = b;
    }
}

class D {
    private final C c;

    @Inject
    D(C c) {
        this.c = c;
    }
}

, а затем используйте Guice для создания и внедрения экземпляров по мере необходимости:

@Module
public class Module {
    @Provides
    public A provideA(@Named("id") String id, @Named("attr") String attr) {
        return A(id, attr);
    }

    @Provides 
    public B provideB(A a) {
        return new B(a);
    }

    @Provides 
    public C provideC(B b) {
        return new C(b);
    }

    @Provides 
    public D provideD(C c) {
        return new D(c);
    }
}
...