Injector.getInstance () всегда вызывает конструктор? - PullRequest
2 голосов
/ 08 декабря 2011

Я отлаживаю ситуацию, когда кажется, что Guice не вызывает конструктор.Он успешно выполняет Foo foo = injector.getInstance(Foo.class) (Foo - конкретный класс), и отладчик показывает, что foo не является нулевым после этого оператора ... все же конструктор не вызывается.

Все из fooПоля имеют значение null, и оператор, который я поместил в конструктор, который создает файл на диске, не называется.

Других конструкторов нет, и Foo не является синглтоном - просто связан нормально.Это происходит при запуске приложения.Конструктор для Foo никогда не запускается вообще - файл, который я упоминал, он пытается создать в конструкторе, никогда не создается, что означает, что код конструктора никогда не выполнялся.

Яработает внутри класса начальной загрузки Play Framework, пытается подключить Guice к работе после того, как у возникли проблемы с Guice Module Play .

Edit - я только что обнаружил, что у меня былоотсутствующий @Inject в конструкторе (он имеет параметры, и @Inject является обязательным для таких конструкторов).Но вопрос по-прежнему актуален - что на самом деле здесь произошло?Guice создал объект без запуска конструктора или Play?

1 Ответ

1 голос
/ 08 декабря 2011

Нет, совсем нет. Области, такие как синглтон, существуют для контроля, когда новые объекты создаются (и не создаются). Кроме того, что-то может быть связано с существующим экземпляром объекта. Например, если бы Foo было enum, getInstance определенно не вызвало бы конструктор.

Что касается того, что на самом деле там произошло, я не могу сказать. Для чего-то, что обычно связано (например, не с провайдером или существующим экземпляром), Guice должен создавать объект, только если он имеет аннотированный конструктор @Inject или только один конструктор без аргументов .

...