2013-09-05 1 views
0

Я довольно новичок в google guice.Как передать объект классу, который будет введен позже.

Я пишу плагин nexus, где nexus вводит некоторые классы. например, введите класс, который должен быть введен в класс A.

Теперь, перед тем как этот класс вводится, у меня есть еще один класс B, который был создан и внутри него. У меня есть метод, в котором объект (например, obj) инициализируется.

Я должен пройти этот инициализируется объект класса А.

Обычно, если конкретизации находится под нашим контролем, я сделаю так, как

A a = new A(); 

A.setObject(obj); 

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

+0

'A' будет иметь свойство« obj ». – SJuan76

+0

Как он узнает, что obj принадлежит к этому классу? –

+0

Можете ли вы написать фрагмент кода и объяснить как ответ? pls –

ответ

1

Если я правильно понимаю, у вас есть что-то вроде

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.