Я использую Guice 3.0 в проекте Groovy и сталкиваюсь со странным/неожиданным поведением инъекций. Мой основной/начальный класс:
class WidgetServicePerfTester {
@Inject
WidgetGenerator widgetGenerator
static main(args) {
Injector injector = Guice.createInjector(new WidgetServicePerfTesterModule())
WidgetServicePerfTester perfTester = injector.getInstance(WidgetServicePerfTester)
perfTester.run()
}
void run() {
List<Widget> widgets = widgetGenerator.generateWidgets()
widgets.each {
it.doStuff()
}
}
}
Мой ПОЖО:
class Widget extends Thingy {
WidgetClient widgetClient
int numFoos
@Override
void doStuff() {
widgetClient.doSomethingOnServer()
}
}
Мои генераторы POJO (API + внедрение):
interface WidgetGenerator {
List<Widget> generateWidgets()
}
class SimpleWidgetGenerator implements WidgetGenerator {
@Inject
WidgetClient widgetClient
int numWidgets
SimpleWidgetGenerator() {
super()
}
SimpleWidgetGenerator(int numWidgets) {
super()
this.numWidgets = numWidgets
}
@Override
List<Widget> generateWidgets() {
List<Widget> widgets = []
Widget firstWidget = new Widget(widgetClient: widgetClient, numFoos: getRandomNumber())
widgets.add(firstWidget)
// Code that populates the rest of 'widgets' with 'numWidgets' number of Widgets.
}
}
Мой модуль Guice:
class WidgetServicePerfTesterModule extends AbstractModule {
@Override
protected void configure() {
bind(WidgetClient).to(SimpleWidgetClient)
}
@Provides
public WidgetGenerator provideSimpleWidgetGenerator() {
new SimpleWidgetGenerator(50)
}
}
Когда я запускаю этот код, я получаю исключения нулевого указателя, потому что WidgetClient
, введенный в каждый Widget
, равен NULL. Почему и как это исправить?
guice-assistedinject
. Это решение работает, но я никогда бы не догадался об этом за миллион лет. При чем здесь эмпирическое правило? Когда следует использоватьFactoryModuleBuilder
? Какие проблемы он решает? Спасибо еще раз! 13.01.2015FactoryModuleBuilder
следует использовать, когда вам нужно создать объект с полями, аннотированными с помощью@Inject
, а также поля, которые не могут быть введены, например. имя студента из БД. Затем, используя вспомогательную инъекцию, вы можете передать аргумент конструктора и ввести поле. Кажется, это то, что вам нужно здесь. 13.01.2015WidgetFactory
импл и как он вводится? 13.01.2015WidgetFactory
реализуется самим guice, вам просто нужно определить фабричные методы и установить фабрику с помощью следующего оператораinstall(new FactoryModuleBuilder().build(WidgetFactory))
. Это все. 14.01.2015