# 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年*
