Как работает AssistedInject для Dagger 2?

Библиотека AssitedInject от Square на самом деле представляет собой процессор аннотаций, который генерирует модули Dagger 2. Dagger 2 также является процессором аннотаций.

И, как я знаю, нет способа контролировать порядок выполнения процессоров.

В этом примере (см. Фрагмент ниже) вы можете видеть, что модуль зависит от сгенерированного классом AssistedInject AssistedInject_MainModule, Так что в случае, если Dagger 2 будет запущен первым, сборка не удастся из-за этого AssistedInject_MainModule не существует.

Но это может быть скомпилировано. Как это работает?

@AssistedModule 
@Module(includes = AssistedInject_MainModule.class) 
public abstract class MainModule { 
    @Provides static @Exclamation String provideExclamation() {
        return "!"; 
    } 
}

1 ответ

Решение

И, как я знаю, нет способа контролировать порядок выполнения процессоров.

Я не смотрел на то, как Dagger 2 или AssistedInject работают под капотом, но в целом обработка аннотаций выполняется в несколько раундов.

Обработка аннотации происходит в последовательности раундов. В каждом раунде процессору может быть предложено обработать подмножество аннотаций, найденных в исходных файлах и файлах классов, созданных в предыдущем раунде.

Файлы генерируются во время этих раундов, но проверка (и ошибки) происходит в более позднем или последнем раунде, когда каждый файл был создан и обработан. Это также упоминается во втором ответе на вопрос, который вы связали. Кто-то также написал подробный ответ о том, как раунды работают по другому вопросу.

Другие вопросы по тегам