Dagger是Google开发的Java/Android依赖注入框架,通过编译时注解处理自动生成依赖注入代码,无需运行时反射,保证类型安全和高效性能。其核心原理是利用`@Inject`标记构造器或字段,`@Module`提供依赖绑定,`@Component`创建注入器接口。Dagger2相比Dagger1去掉了反射和配置代码,常用于Android应用中的对象管理、生命周期控制及测试隔离。使用时需在Gradle中添加依赖、定义组件和模块,并通过`DaggerXxxComponent.create()`初始化。常见应用场景包括Activity注入、ViewModel注入及Retrofit与Room等库的集成。
【常见问题】
问题1:Dagger与依赖注入是什么关系?
回答1:Dagger是实现依赖注入(DI)的一种具体框架,它通过自动生成代码将依赖对象的创建和生命周期管理从业务逻辑中分离,从而降低耦合、提高可测试性。
问题2:Dagger的编译时注解是如何工作的?
回答2:Dagger利用Java注解处理器在编译期扫描`@Inject`、`@Module`、`@Component`等注解,生成工厂类和组件实现类,这些运行时代码直接调用构造器或模块方法,无需反射,因此性能高于运行时DI框架。
问题3:如何在Android项目中配置Dagger?
回答3:在`build.gradle`中添加`annotationProcessor'com.google.dagger:dagger-compiler:2.xx'`和`implementation'com.google.dagger:dagger:2.xx'`,然后定义`@Module`和`@Component`,最后在Application或Activity中调用`DaggerXxxComponent.create().inject(this)`完成依赖注入。
问题4:Dagger的`@Singleton`注解有何作用?
回答4:`@Singleton`是Dagger的作用域注解,标记后,Dagger会在组件生命周期内保证该依赖只被实例化一次,并以单例模式提供,避免重复创建对象,常用于网络客户端、数据库实例等场景。
问题5:Dagger与Hilt有何区别?
回答5:Hilt是Google基于Dagger封装的Android专用依赖注入库,简化了组件层级和配置,通过`@HiltAndroidApp`、`@AndroidEntryPoint`等注解自动生成标准组件,更适合现代Android开发,底层仍使用Dagger的编译时处理机制。


