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