Android application development 第24章:HiltによるDI導入とその注意点

🔰 Hiltとは?

**Hilt(ヒルト)**は、Google が公式に提供する Android 専用の DI(依存性注入)フレームワークです。
内部では Dagger2 をベースにしていますが、「Activityのスコープ」や「ViewModelへの注入」など、Android特有の構造に最適化されているのが特徴です。

Java で Spring Framework を使ったことがある方は、@Autowired@Component を使った DI をイメージしてもらうと近いです。


🛠 Hiltの導入ステップ(基本の流れ)

1. 依存関係を追加

build.gradle (app) に以下を追加します:

plugins {
    id 'dagger.hilt.android.plugin'
}

dependencies {
    implementation "com.google.dagger:hilt-android:2.x"
    kapt "com.google.dagger:hilt-compiler:2.x"
}

2.x には最新版のバージョンを指定します。


2. Applicationクラスにアノテーションを付ける

@HiltAndroidApp
public class MyApp extends Application {
}

これにより、アプリ全体で Hilt の DI コンテナが使えるようになります。


3. 依存を注入するクラスに @AndroidEntryPoint を付ける

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
    @Inject
    TaskRepository repository;
}

このアノテーションを使うことで、Hilt がこのクラスに必要な依存関係を自動的に注入します。


4. 依存性を提供するクラス(モジュール)を作成

@Module
@InstallIn(SingletonComponent.class)
public class AppModule {

    @Provides
    public static TaskRepository provideTaskRepository() {
        return new TaskRepository();
    }
}
  • @Module:依存性を提供するクラスに付ける
  • @Provides:戻り値を依存オブジェクトとして提供する

⚠ 注意点とハマりどころ

1. Hilt対象のクラスは必ず@AndroidEntryPointが必要

  • これを忘れると xxx is not annotated with @AndroidEntryPoint のようなエラーになります。

2. ViewModelへのDIにはHiltViewModelを使う

@HiltViewModel
public class MainViewModel extends ViewModel {

    private final TaskRepository repository;

    @Inject
    public MainViewModel(TaskRepository repository) {
        this.repository = repository;
    }
}

ViewModel を使う側(Activityなど):

viewModel = new ViewModelProvider(this).get(MainViewModel.class);

Hilt の DI は、ViewModel のライフサイクルも意識して設計されています。


3. カスタムクラスやライブラリの注入は要注意

  • Retrofit や Room などの外部ライブラリも DI 対象にできますが、スコープやインスタンス生成のタイミングには注意が必要です。
  • @Singleton@ActivityRetainedScoped など、スコープの選択を誤るとバグにつながりやすいです。

4. kapt(Kotlin Annotation Processing Tool)を使うことに注意

  • Javaプロジェクトでも kapt が必要になることがあり、ビルド設定が少し複雑になることがあります。

✅ まとめ

特徴内容
Androidに最適化されたDIActivity / Fragment / ViewModelに自然に注入可能
Dagger2より簡単アノテーションベースで最小限の設定
スコープに注意が必要Singleton, ActivityScoped などを意識する

mh

Related Posts

Android application development 第25章:Androidアプリ開発における単体テスト(JUnit)

Android application development 第23章:Javaエンジニアに向けたDIの復習

🔧 そもそもDI(依存性注入)とは? DI(Dependen…

You Missed

Kubernetes Learning 第21章:Secretの暗号化とマウント方法 〜機密情報を安全に扱うKubernetesの基本〜

  • 投稿者 mh
  • 5月 25, 2025
  • 11 views

Android application development 第25章:Androidアプリ開発における単体テスト(JUnit)

  • 投稿者 mh
  • 5月 25, 2025
  • 11 views

Kubernetes Learning 第20章:ConfigMapの詳細 〜アプリケーション設定をKubernetesで管理する〜

  • 投稿者 mh
  • 5月 24, 2025
  • 24 views

Android application development 第24章:HiltによるDI導入とその注意点

  • 投稿者 mh
  • 5月 24, 2025
  • 24 views

Kubernetes Learning 第19章:ローカルストレージとクラウドストレージ(EBS, NFSなど)

  • 投稿者 mh
  • 5月 23, 2025
  • 36 views

Android application development 第23章:Javaエンジニアに向けたDIの復習

  • 投稿者 mh
  • 5月 23, 2025
  • 31 views