Внедрение кинжала 2 в классе Java

Я пытаюсь использовать Dagger2 для DI, он отлично работает для классов, связанных с Activity/Fragment, где есть событие onCreate lifecycle. Теперь у меня есть простой Java-класс, который я хочу ввести. Любые идеи относительно того, как это сделать, будут оценены. Код, который у меня есть, выглядит следующим образом:

BasicMoviesUsecaseComponent.java -

@PerActivity
@Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class)
public interface BasicMoviesUsecasesComponent {
    void inject(PaymentsManager paymentsManager);
}

DatabaseModule.java -

    @Module
    public class DatabaseModule {
       @Provides @Singleton
       Realm provideRealmInstance(Context context) {

           return Realm.getInstance(context);
       }

       @Provides @Singleton
       DatabaseProvider provideDatabaseInstance(Realm realm) {

           return new DatabaseProvider(realm);
       }

       @Provides @Singleton
       SharedPreferences provideSharedPrefs(Context context) {

            return context.getSharedPreferences(context.getPackageName()+"_prefs", Context.MODE_PRIVATE);
       }

       @Provides @Singleton
       SharedPreferencesManager provideSharedPreferencesManager(SharedPreferences sharedPreferences) {
            return new SharedPreferencesManager(sharedPreferences);
       }

        @Provides @Singleton
        PaymentsManager providePaymentsManager(SharedPreferencesManager sharedPreferencesManager) {

              return new PaymentsManager(sharedPreferencesManager);

        }

}

AppComponent.java -

  @Singleton
  @Component(modules = {
    ApplicationModule.class,
    DomainModule.class,
    DatabaseModule.class
   })

public interface AppComponent {

    Bus bus();
    Realm realm();
    DatabaseProvider dbProvider();
    SharedPreferencesManager sharedPreferencesManager();
}

Вот класс, который мне нужно ввести SharedPreferencesManager, и я не могу этого сделать:

MyManager.java -

 private class MyManager {
    private SharedPreferencesManager manager;

    @Inject
    MyManager(SharedPreferencesManager manager){
          this.manager = manager;           
    } 

    private void initializeDependencyInjector() {

          BMSApplication app = BMSApplication.getInstance();

          DaggerBasicMoviesUsecasesComponent.builder()
                 .appComponent(app.getAppComponent())
                 .basicMoviesUsecasesModule(new BasicMoviesUsecasesModule())
                 .build().inject(PaymentsManager.this);
    }

}

Как я могу вызвать initializeDependencyInjector()?

Ответ 1

Обычно вам следует использовать конструкторную инъекцию. Вызов component.inject(myObject) в основном используется для объектов, которые вы не можете создать самостоятельно (например, действия или фрагменты).

Инъекция конструктора - это в основном то, что вы уже сделали:

private class MyManager {
    private SharedPreferencesManager manager;

    @Inject
    MyManager(SharedPreferencesManager manager){
          this.manager = manager;           
    } 
}

Кинжал создаст объект для вас и передаст ваш SharedPreferencesManager. Нет необходимости вызывать init или что-то подобное.

Реальный вопрос - как получить объект MyManager. Чтобы сделать это, снова, кинжал будет обрабатывать его для вас.

@Inject конструктор с помощью @Inject вы @Inject кинжал, как он может создать объект этого типа. Чтобы использовать его, просто введите его или объявите его как зависимость.

private class MyActivity extends Activity {
    @Inject
    MyManager manager;

    public void onCreate(Bundle savedState){
        component.inject(this);  
    } 
}

Или просто добавьте getter к компоненту (при условии, что SharedPreferenceManager может быть предоставлен, MyManager также может быть MyManager):

@Component(dependencies = SharedPreferenceManagerProvidingComponent.class)
public interface MyComponent {

    MyManager getMyManager();
}