Вопрос о внедрении зависимостей

Всем привет!

У меня есть несколько вопросов по механизму внедрения зависимостей в Java. Чтобы было понятнее постараюсь проиллюстрировать вопросы.

  1. Правильно ли я понимаю, что при использовании @Inject к полю класса, механизм внедрения зависимостей создаст новый экземпляр компонента?

Допустим в каком-то классе я в первый раз использую @Inject.

    @Inject
    private JWTAuthContextInfo authContextInfo;

Будет ли это равносильно тому, что я вызову new?

    private JWTAuthContextInfo authContextInfo = new JWTAuthContextInfo();
  1. Если я применю @Inject еще раз (в другом классе), то что я получу? Будет создан еще один экземпляр или механизм DI подставит предыдущий экземпляр компонента?

В другом классе я снова применяю @Inject

    @Inject
    private JWTAuthContextInfo authContextInfo;

Вызовет ли CDI new?

    private JWTAuthContextInfo authContextInfo = new JWTAuthContextInfo();

Или он подставит предыдущий созданный компонент?

Буду благодарен всем за ответы!


Ответы (1 шт):

Автор решения: Sergei Buvaka

Здесь все зависит от того как вы пропишете ваши зависимости. Если у к примеру вы в модуле напишете метод

@Provides
@Singleton
static JWTAuthContextInfo provide JWTAuthContextInfo() {
    return new JWTAuthContextInfo();
}

То вы создадите ваш объект один раз, после чего Dagger его закеширует и будет отдавать этот же экземпляр всякий раз когда вы его попросите.

@Provides
static JWTAuthContextInfo provide JWTAuthContextInfo() {
    return new JWTAuthContextInfo();
}

В этом случае Dagger будет будет всегда создавать новый объект.

Вы так же можете описать свою аннотацию Scope и с помощью нее определять сколько будет жить ваш объект.

И вообще рекомендую к прочтению серию статей по Dagger 2.

→ Ссылка