Прежде всего, можно использовать Guice, не помещая аннотацию @Inject
в любом месте. Guice поддерживает привязки провайдера , @ Предоставляет методы и привязки конструктора , которые позволяют вам связывать типы по вашему выбору. Тем не менее, для нормальной работы он требует, чтобы @Inject
аннотации служили метаданными, сообщающими ему, какие зависимости требуются классу и где он может их внедрить.
Есть причина этого в том, что в противном случае он не может определенно сказать, что он должен вводить и где. Например, классы могут иметь несколько конструкторов, и Guice нужен какой-то способ выбрать один для внедрения, который не основывается на догадках. Вы можете сказать: «Ну, у моих классов только один конструктор, поэтому ему не нужно @Inject
», но что происходит, когда кто-то добавляет новый конструктор в класс? Тогда у Guice больше нет оснований для принятия решения, и приложение перестает работать. Кроме того, все это предполагает, что вы только делаете инъекцию конструктора. Хотя внедрение конструктора, безусловно, является лучшим выбором в целом, Guice также допускает внедрение методов (и полей), и проблема необходимости явно указывать точки внедрения класса здесь более серьезна, так как большинство классов будет иметь много методов, которые не являются используется для инъекций и не более нескольких из них.
В дополнение к важности @Inject
в сообщении Guice, он также служит документацией о том, как класс предназначен для использования - что этот класс является частью проводной инфраструктуры внедрения зависимостей приложения. Это также помогает быть последовательным в применении @Inject
аннотаций к вашим классам, даже если в настоящее время это не будет абсолютно необходимо для тех, кто просто использует один конструктор. Я также хотел бы отметить, что вы можете использовать аннотацию @javax.inject.Inject
JSR-330 в Guice 3.0, если стандартная аннотация Java предпочтительнее, чем специфичная для Guice.
Мне не совсем понятно, что вы имеете в виду, когда спрашиваете о поле действия у провайдера. Области обычно не создают объекты сами по себе; они контролируют, когда запрашивать у поставщика с незаданной областью зависимости для нового экземпляра, и как контролировать область действия этого экземпляра. Конечно, провайдеры являются частью того, как они работают, но я не уверен, что вы это имеете в виду. Если у вас есть какой-то особый способ предоставления экземпляров объектов, то для этого нужно использовать Provider
привязки и @Provides
методы, которые не требуют аннотаций @Inject
для самих классов.