2016-03-23 2 views
1

Как раз сейчас, чтобы ввести объект типа Foo в Bar, я делаю следующее.Нужно ли использовать фабрику, чтобы ввести простой объект в Джерси?

Класс, который будет введен в:

class Bar { 
    @Inject 
    Foo field; 

    public Foo getField() { return field; } 
} 

код, реализующий Factory:

public class Foo implements Factory<Foo> { 
    @Override 
    public Foo provide() { 
     return new Foo(); 
    } 

    @Override 
    public void dispose(Foo f) { 
    } 
} 

код в основной конфигурации:

final ResourceConfig rc = new ResourceConfig() 
       .packages("com.example") 
       .register(
         new AbstractBinder() { 
          @Override 
          protected void configure() { 
           bindFactory(new FooFactory()).to(Foo.class).in(Singleton.class); 
          } 
         }) 

Мой вопрос ... В Джерси 2.0, который использует hk2 для инъекции зависимостей, все равно нужно вводить объект без создания фабричного класса?

ответ

1

Для впрыскивания без использования Factory или InjectionResolver можно использовать AbstractBinder.

register(new AbstractBinder() { 
     @Override 
     protected void configure() { 
      bind(Foo.class).to(Foo.class); 
      bind(Bar.class).to(Bar.class); 
     } 
    }); 

В этом случае классы Foo и Bar имеют пустые конструкторы.

public class Bar { 
    @Inject 
    Foo field; 
    public Foo getField() { return field; } 
} 

public class Foo {} 

Теперь вы можете ввести Bar в ресурс или другие бобы hk2.

+0

Что делать, если класс имел конструктор с параметрами? Все ли эти параметры нуждаются в @Inject? – oibe

+0

невозможно, вы можете использовать @Inject только в полях или привязать экземпляр таким образом: bind (new Bar («test»)). To (Bar.class); –

+0

в целом, для более сложных требований к впрыску (например, с помощью вспомогательной инъекции) вам необходимо использовать InjectionResolver или Factory. –

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