2013-12-23 3 views
1

Есть ли у Guice возможность просто создать несколько объектов/компонентов с разными значениями/параметрами? Например, скажем, у меня есть класс Triangle, и я хочу в конфигурации создать несколько треугольников, один с параметром lengh = 6, один с length = 5 и пусть скажем другой без параметров вообще. Если я пытаюсь что-то вроде этого:Java Guice - эквивалентный способ создания нескольких «бобы», как весной?

bind(Triangle.class).to(IsoTriangle.class); 
bind(Triangle.class).toInstance(new Triangle(6)); 

Я получаю сообщение об ошибке:

A binding to test.Triangle was already configured at test.Configuration.configure(Configuration.java:14). at test.Configuration.configure(Configuration.java:15)

Если я пытаюсь вызвать два экземпляра треугольника в основной метод, как:

Triangle tr = injector.getInstance(Triangle.class); 
Triangle tr2 = injector.getInstance(Triangle.class); 

Второй экземпляр просто игнорируется, поскольку я не вижу, что он используется второй раз.

Я читал, что есть что-то вроде этого:

class LegModule extends PrivateModule { 
    private final Class<? extends Annotation> annotation; 

    LegModule(Class<? extends Annotation> annotation) { 
    this.annotation = annotation; 
    } 

    @Override protected void configure() { 
    bind(Leg.class).annotatedWith(annotation).to(Leg.class); 
    expose(Leg.class).annotatedWith(annotation); 

    bindFoot(); 
    } 

    abstract void bindFoot(); 
} 
    public static void main(String[] args) { 
    Injector injector = Guice.createInjector(
     new LegModule(Left.class) { 
      @Override void bindFoot() { 
      bind(Foot.class).toInstance(new Foot("leftie")); 
      } 
     }, 
     new LegModule(Right.class) { 
      @Override void bindFoot() { 
      bind(Foot.class).toInstance(new Foot("righty")); 
      } 
     }); 
    } 

Но это больше похоже на трюк/взломать (вам нужно сделать такого рода вещи в основном методе, как весной вы не делаете. нужно что-то делать вообще, но я полагаю, что идеи для этих фреймворков совершенно разные). Есть ли у Guice простой способ сделать это или Guice цель заключается в связывании все к одному экземпляру и не позволяют создавать несколько те же объекты типа ..

Update Весной прямо вперед: Например, чтобы создать несколько треугольников, я могу просто сделать это:

<bean id="triangle1" 
    class="test.Triangle" 
    > 
    <constructor-arg type="int" value="6"/> 
</bean> 

<bean id="triangle2" 
    class="test.Triangle" 
    > 
    <constructor-arg type="int" value="5"/> 
</bean> 
+0

могли бы вы записать то, что вы могли бы сделать весной? Может помочь понять, чего вы хотите. – nhu

+0

См. Https://code.google.com/p/google-guice/wiki/InjectingProviders. Он покажет вам, как получить несколько экземпляров того же типа. Но он не говорит вам, как получить несколько разных экземпляров. –

+0

@ArnaudDenoyelle, поэтому мне нужно создать какой-то метод, который создает несколько экземпляров? Поэтому каждый раз, когда я захочу добавить/удалить экземпляр, мне нужно будет изменить этот метод? – Andrius

ответ

5

UPDATE: для отражения данного примера

в вашем модуле:

bind(Triangle.class) 
    .annotatedWith(Names.named("triangle1") 
    .toInstance(new Triangle(6)); 
bind(Triangle.class) 
    .annotatedWith(Names.named("triangle2") 
    .toInstance(new Triangle(5)); 

И тогда в вашем коде что-то вроде:

@Inject 
public void setTriangle 
    (@Named("triangle1")Triangle triangle){ 
    this.triangle = triangle; 
} 
+0

Спасибо, что это полезно, хотя это не так красиво, как весной :) – Andrius

+0

И должен быть другой setTriangle с '' треугольником2 ''правильно? – Andrius

+0

Правильно, или вы можете напрямую аннотировать поля или конструктор. – nhu

Смежные вопросы