Hilt - 关于将模块中的 Dao 对象设为 Singleton 的问题

问题描述 投票:0回答:2

我正在使用 Google Sunflower 应用程序存储库按照

Hilt
进行依赖注入教程:

@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {

    @Singleton
    @Provides
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return AppDatabase.getInstance(context)
    }

    @Provides
    fun providePlantDao(appDatabase: AppDatabase): PlantDao {
        return appDatabase.plantDao()
    }

    @Provides
    fun provideGardenPlantingDao(appDatabase: AppDatabase): GardenPlantingDao {
        return appDatabase.gardenPlantingDao()
    }
}

https://github.com/android/sunflower/blob/main/app/src/main/java/com/google/samples/apps/sunflower/di/DatabaseModule.kt

我注意到他们没有对下面的两个函数使用

Singleton
注释
provideAppDatabase()

这是否意味着通过在

Singleton
上使用
provideAppDatabase
注解,会自动使
providePlantDao()
provideGardenPlantingDao()
这两个函数成为单例?


我查过的其他教程,将

Dao
提供的功能用
@Singleton
注释。

@Module
@InstallIn(SingletonComponent::class)
object DbModule {
    @Provides
    @Singleton
    fun provide(@ApplicationContext context: Context) = Room.databaseBuilder(
        context, NoteDatabase::class.java, NOTE_DATABASE)
        .allowMainThreadQueries()
        .fallbackToDestructiveMigration()
        .build()

    @Provides
    @Singleton
    fun provideDao(db: NoteDatabase) = db.noteDoa()
  
}

https://androidgeek.co/how-to-use-hilt-with-room-database-complete-guide-part-2-2c2bbf52f610

所以我很困惑是否要注释。

android dagger-2 dagger-hilt
2个回答
1
投票

在Sunflower应用程序的DatabaseModule类中,provideAppDatabase()函数使用@Singleton注解进行注释,这意味着它将是SingletonComponent类范围内的单例对象。这意味着当调用 ProvideAppDatabase() 函数时,只会创建并提供 AppDatabase 类的一个实例,并且该实例将在依赖于它的所有组件之间共享。

另一方面,providePlantDao() 和 ProvideGardenPlantingDao() 函数没有使用 @Singleton 注释进行注释。这意味着每次注入时都会调用这些函数,并且每次都会创建并提供 PlantDao 或 GardenPlantingDao 类的新实例。

一般来说,使用 @Singleton 注释来注释任何想要成为单例的对象是一个很好的做法。这有助于确保仅创建该对象的一个实例并在依赖于它的所有组件之间共享,这可以提高应用程序的效率和性能。

在您提供的第二个示例中,DbModule 对象使用@Singleton 注释进行注释,并且provide() 和provideDao() 函数也使用@Singleton 注释进行注释。这意味着 NoteDatabase 和 NoteDao 对象都将是 SingletonComponent 类范围内的单例。

我希望这有助于阐明 @Singleton 注释在 Hilt 依赖注入中的使用。


0
投票

@singleton 对于 daos 来说不是必需的,因为在生成类时会处理它。

public final class AppDatabase_Impl extends AppDatabase {
  private volatile ItemDao _itemDao;

  @Override
  public ItemDao itemDao() {
    if (_itemDao != null) {
      return _itemDao;
    } else {
      synchronized(this) {
        if(_itemDao == null) {
          _itemDao = new ItemDao_Impl(this);
        }
        return _itemDao;
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.