WordPress DemoSite

Тестовый сайт для экспериментов и демонстраций возможностей

Dagger 2 — фреймворк для dependency injection (DI) в Java/Kotlin

Dagger 2 — это инструмент для автоматического внедрения зависимостей, разработанный Google. Он генерирует код на этапе компиляции (без рефлексии), что делает его быстрым и безопасным.


🔥 Основные концепции Dagger 2

1. Dependency Injection (DI)

Паттерн, при котором зависимости (сервисы, репозитории и т.д.) передаются в класс извне, а не создаются внутри него.

Пример без DI:

class Car {
    private val engine = Engine()  // Прямое создание зависимости
}

Пример с DI:

class Car(private val engine: Engine)  // Зависимость внедряется извне

2. Компоненты Dagger 2


Пример работы Dagger 2

1. Создаём зависимости

class Engine @Inject constructor()  // Dagger сможет создавать Engine

class Car @Inject constructor(private val engine: Engine)  

2. Модуль (если зависимость нельзя создать через @Inject)

@Module
class AppModule {
    @Provides
    fun provideEngine(): Engine = DieselEngine()  // Специальная реализация
}

3. Компонент

@Component(modules = [AppModule::class])
interface AppComponent {
    fun inject(activity: MainActivity)  // Точка внедрения
}

4. Генерация и использование

Dagger создаст реализацию AppComponent в момент компиляции:

class MainActivity : AppCompatActivity() {
    @Inject lateinit var car: Car  // Поле для внедрения

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DaggerAppComponent.create().inject(this)  // Внедрение!
        car.start()  
    }
}

🌟 Преимущества Dagger 2

Нет рефлексии — весь код генерируется на этапе компиляции.
Проверка зависимостей на этапе компиляции (если что-то не сходится — ошибка).
Высокая производительность (оптимизированный код).
Поддержка Kotlin и Java.


📉 Сложности Dagger 2

Сложный входной порог — много новых терминов.
Избыточность для маленьких проектов.
Неудобные ошибки компиляции, если что-то настроено неверно.


🔄 Dagger 2 vs. Koin

КритерийDagger 2Koin
Принцип работыГенерация кода (компиляция)Рефлексия + прокси-объекты
Производительность⚡ Быстрее (нет runtime-накладок)🐢 Медленнее
СложностьВысокаяНизкая
ПоддержкаJava/KotlinТолько Kotlin

Когда выбирать Dagger 2?

Когда выбирать Koin?


🛠 Продвинутые возможности Dagger 2

Пример с @Singleton:

@Module
class NetworkModule {
    @Singleton  // Один экземпляр на всё приложение
    @Provides
    fun provideApiService(): ApiService = Retrofit.create()
}

📚 Как выучить Dagger 2?

  1. Официальная документация: dagger.dev.
  2. Практика:
  1. Книги:

🚀 Пример с Android

Внедрение SharedPreferences

@Module
class StorageModule {
    @Provides
    fun provideSharedPrefs(context: Context): SharedPreferences {
        return context.getSharedPreferences("app_prefs", MODE_PRIVATE)
    }
}

@Component(modules = [StorageModule::class])
interface AppComponent {
    fun inject(activity: SettingsActivity)
}

// Использование:
class SettingsActivity : AppCompatActivity() {
    @Inject lateinit var prefs: SharedPreferences
}

💡 Советы по Dagger 2

Старайтесь избегать @Inject в Android-активностях (лучше использовать ViewModel).
Разделяйте компоненты по функционалу (например, NetworkComponent, StorageComponent).
Используйте @Named для однотипных зависимостей:

@Provides @Named("prod") fun provideProdApi(): Api = ...  
@Provides @Named("mock") fun provideMockApi(): Api = ...  

🔥 Вывод

Dagger 2 — это мощный инструмент для DI, который:
✅ Уменьшает связанность кода.
✅ Упрощает тестирование.
✅ Ускоряет работу приложения.

Используйте его, если:

Альтернативы:

Полный стэк: .NET | AMQP | Android | api | Bash | Bootstrap | C++ | cms | Composer | css | Data | Elasticsearch | ESP32 | Git | GraphQL | Gulp | JavaScript | JetStream | Joomla | js | Kotlin | Laravel | LEMP | Linux | LMS | Markdown | MODX | Moodle | MySQL | NATS | Nginx | Node.js | OpenCart | Parsedown | PHP | Python | RabbitMQ | SCSS | SEO | Simpla | SOAP | SQL | startup | Swift | Symfony | Tailwind | Translation | Twig | Ubuntu | Unit | web3 | Webasyst | Webpack | WebSocket | WordPress | XML | Бизнес | блокчейн | ИИ | интернет-магазин | ЛК | Руководство | ТЗ | фреймворк | Яндекс.Трекер