本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
Dagger 是一个用于 Android 应用程序的依赖注入(Dependency Injection, DI)框架。它通过使用代码生成来实现依赖的注入,具有高效的性能和编译时验证的优点。Dagger 的核心目标是帮助开发者管理对象的创建和依赖,简化代码结构,提高代码的可测试性和可维护性。
Dagger 的基本概念
-
Module(模块):
- 使用
@Module
注解来标记类,该类提供依赖的对象。 @Provides
注解的方法用于告知 Dagger 如何创建某个类的实例。
- 使用
-
Component(组件):
- 使用
@Component
注解,定义一个接口来提供依赖注入的容器,它连接模块和需要依赖的地方。 - Component 是一个桥梁,用于将
@Inject
标记的变量与@Module
提供的方法连接起来。
- 使用
-
Inject(注入):
- 使用
@Inject
注解标记需要注入的变量或构造函数。 - 可以直接注入字段、构造函数或者方法(较少用)。
- 使用
-
Scope(作用域):
- 用于控制对象实例的生命周期。
- 常见的作用域有
@Singleton
,表示同一个对象实例在 Component 生命周期内的单例。
-
Qualifier(限定符):
- 使用
@Qualifier
自定义注解,可用于区分不同的依赖实现。
- 使用
代码示例
我们将开发一个简单的示例应用程序,包括以下四个主要模块:NetworkService
,UserRepository
,MainViewModel
和 MainActivity
。
- Module 定义:
import dagger.Module;
import dagger.Provides;
import javax.inject.Singleton;
@Module
public class NetworkModule {
@Provides
@Singleton
NetworkService provideNetworkService() {
// 返回一个网络服务实例
return new NetworkService();
}
}
@Module
public class RepositoryModule {
@Provides
UserRepository provideUserRepository(NetworkService networkService) {
// 使用 NetworkService 构造 UserRepository
return new UserRepository(networkService);
}
}
- Component 定义:
import dagger.Component;
import javax.inject.Singleton;
@Singleton
@Component(modules = {NetworkModule.class, RepositoryModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
}
- 应用层代码:
public class NetworkService {
// 网络服务实现
}
public class UserRepository {
private final NetworkService networkService;
@Inject
public UserRepository(NetworkService networkService) {
this.networkService = networkService;
}
// 用户数据处理逻辑
}
- ViewModel 和 Activity:
public class MainViewModel {
private final UserRepository userRepository;
@Inject
public MainViewModel(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ViewModel 逻辑
}
public class MainActivity extends AppCompatActivity {
@Inject
MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在 Activity 创建时进行依赖注入
DaggerAppComponent.create().inject(this);
// 使用 mainViewModel
}
}
重要步骤:
- 创建
Module
来提供依赖。 - 创建
Component
接口,定义注入目标,如 Activity。 - 使用
@Inject
注解标记依赖需要被注入的地方。 - 实例化 Component 并调用注入方法,比如
DaggerAppComponent.create().inject(this);
。
Dagger 在编译时生成实现,使得应用程序的依赖关系在编译期得以确保,避免运行时出现错误。此外,由于它在生成代码时是静态的,这意味着可以在生成的代码中进行优化,结果往往比反射实现更高效。
欢迎关注我的公众号AntDream查看更多精彩文章!