Middle
Dagger çerçevesinden bahsedin.
sobes.tech yapay zeka
AI'dan gelen yanıt
Dagger, Java ve Android'de bağımlılık enjeksiyonu (dependency injection, DI) için bir çerçevedir. JSR-330 spesifikasyonuna dayanır. Dagger V2, çalışma zamanında ek maliyetleri ortadan kaldıran derleme aşamasında kod üretimi kullanır, bu da refleksif DI çerçevelerine özgü maliyetleri ortadan kaldırır.
Dagger'ın temel kavramları:
- Modüller (
@Module): Bağımlılık sağlayan sınıflar. İçlerinde,@Providesile işaretlenmiş metodlar, Dagger'ın enjekte edebileceği nesne örnekleri döner.
@Module
public class AppModule {
@Provides
Context provideAppContext(Application app) {
return app.getApplicationContext();
}
}
- Bileşenler (
@Component): Modülleri ve bağımlılık enjeksiyonu yapılan yerleri bağlayan arayüzler. Bağımlılık örnekleri döndüren veya enjeksiyon yapan metodlar içerir (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
Context getAppContext();
void inject(MyApplication application); // Enjeksiyon metodu
}
- Enjeksiyon (
@Inject): Dagger'a, bağımlılığı nerede sağlayacağını belirten anotasyon. Yapıcılar, alanlar ve metodlara uygulanabilir.
public class UserManager {
private final UserRepository userRepository;
@Inject // Yapıcı aracılığıyla enjeksiyon
public UserManager(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
public class MainActivity extends AppCompatActivity {
@Inject // Alan aracılığıyla enjeksiyon
UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
// Bileşeni al ve bağımlılıkları enjekte et
((MyApplication) getApplication()).getAppComponent().inject(this);
}
}
- Kapsam (
@Singleton,@Scope): Sağlanan bağımlılıkların yaşam süresini belirleyen anotasyonlar.@Singletonvarsayılandır, ancak kendi kapsam anotasyonlarınızı oluşturabilirsiniz.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}
@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
Dagger'ın avantajları:
- Performans: Derleme zamanında kod üretimi, çalışma zamanındaki maliyetleri minimize eder.
- Tip güvenliği: Bağımlılık grafındaki hatalar, derleme zamanında tespit edilir.
- İzlenebilirlik: Dagger tarafından üretilen kod okunabilir.
- Test kolaylığı: Bağımlılıkları kolayca mock'lar ile değiştirebilirsiniz.
Dezavantajlar:
- Öğrenme eğrisi dik.
- Bazı durumlarda karmaşık sözdizimi.
- Derleme süresini artırır.
Dagger, bağımlılıkları yönetmek ve kodu yapılandırmak için büyük Android uygulamalarında aktif olarak kullanılmaktadır.