3.0 KiB
3.0 KiB
Dagger2原理
目录
Dagger2原理
定义
// Dagger2:依赖注入框架
// 编译时生成代码
// 类型安全
// 性能好
核心概念
// 1. Component:组件,注入器
// 2. Module:模块,提供依赖
// 3. Inject:注入标记
// 4. Provides:提供方法
依赖注入
依赖注入方式
// 1. 构造函数注入
public class UserRepository {
private ApiService apiService;
@Inject
public UserRepository(ApiService apiService) {
this.apiService = apiService;
}
}
// 2. 字段注入
public class MainActivity extends AppCompatActivity {
@Inject
UserRepository userRepository;
}
// 3. 方法注入
@Inject
void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
注解处理
注解类型
// @Inject:标记需要注入的依赖
@Inject
UserRepository userRepository;
// @Module:提供依赖的模块
@Module
public class AppModule {
@Provides
ApiService provideApiService() {
return new ApiService();
}
}
// @Component:注入器
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
组件与模块
Module
@Module
public class AppModule {
@Provides
@Singleton
ApiService provideApiService() {
return new ApiService();
}
}
Component
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
// 使用
AppComponent component = DaggerAppComponent.builder()
.appModule(new AppModule())
.build();
component.inject(this);
Dagger2源码分析
关键类
// Component:组件接口
// Module:模块类
// Inject:注入注解
// DaggerXXX:生成的组件实现
编译时生成
// 编译时生成 DaggerAppComponent
// 实现 AppComponent 接口
// 提供依赖注入逻辑
Dagger2最佳实践
1. 使用单例
@Provides
@Singleton
ApiService provideApiService() {
return new ApiService();
}
2. 模块化设计
// 按功能划分模块
@Module
public class NetworkModule { }
@Module
public class DatabaseModule { }
面试常见问题
Q1: Dagger2 的原理?
答案:
- 编译时生成代码
- 实现依赖注入
- 类型安全,性能好
Q2: Dagger2 和 Hilt 的区别?
答案:
- Dagger2:基础框架,需要手动配置
- Hilt:Dagger2 的封装,更易用,官方推荐
Q3: 依赖注入的优势?
答案:
- 解耦:降低耦合度
- 测试:易于测试
- 复用:代码复用
最后更新:2024年