Sobes.tech
Middle

Fale sobre o framework Dagger.

sobes.tech IA

Resposta da IA

Dagger é um framework para injeção de dependências (dependency injection, DI) em Java e Android. Baseia-se na especificação JSR-330. O Dagger V2 usa geração de código na fase de compilação, o que elimina os custos adicionais em tempo de execução, típicos de frameworks de DI reflexivos.

Conceitos-chave do Dagger:

  • Módulos (@Module): Classes que fornecem dependências. Dentro delas, métodos anotados com @Provides retornam instâncias de objetos que o Dagger pode injetar.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Componentes (@Component): Interfaces que conectam módulos e locais de injeção de dependências. Contêm métodos que retornam instâncias de dependências ou métodos de injeção (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Método de injeção
}
  • Injeção (@Inject): Anotação que indica ao Dagger onde fornecer uma dependência. Pode ser aplicada a construtores, campos e métodos.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Injeção via construtor
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Injeção via campo
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Obtenção do componente e injeção de dependências
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Escopo (@Singleton, @Scope): Anotações que definem o tempo de vida das dependências fornecidas. @Singleton por padrão, mas é possível criar suas próprias anotações de escopo.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
    void inject(MainActivity activity);
}

Vantagens do Dagger:

  • Desempenho: A geração de código na fase de compilação minimiza os custos em tempo de execução.
  • Segurança de tipos: Erros no grafo de dependências são detectados na compilação.
  • Verificabilidade: O código gerado pelo Dagger é legível.
  • Facilidade de teste: Dependências podem ser facilmente substituídas por mocks.

Desvantagens:

  • Curva de aprendizado íngreme.
  • Sintaxe complexa em alguns casos.
  • Aumento no tempo de compilação.

O Dagger é amplamente utilizado em grandes aplicativos Android para gerenciar dependências e estruturar o código.