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@Providesretornam 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.@Singletonpor 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.