心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。
Dagger 是一个用于 Android 应用程序的依赖注入(Dependency Injection, DI)框架。它通过使用代码生成来实现依赖的注入,具有高效的性能和编译时验证的优点。Dagger 的核心目标是帮助开发者管理对象的创建和依赖,简化代码结构,提高代码的可测试性和可维护性。
@Module 注解来标记类,该类提供依赖的对象。@Provides 注解的方法用于告知 Dagger 如何创建某个类的实例。@Component 注解,定义一个接口来提供依赖注入的容器,它连接模块和需要依赖的地方。@Inject 标记的变量与 @Module 提供的方法连接起来。@Inject 注解标记需要注入的变量或构造函数。@Singleton,表示同一个对象实例在 Component 生命周期内的单例。@Qualifier 自定义注解,可用于区分不同的依赖实现。我们将开发一个简单的示例应用程序,包括以下四个主要模块:NetworkService,UserRepository,MainViewModel 和 MainActivity。
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);
}
}
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;
}
// 用户数据处理逻辑
}
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 注解标记依赖需要被注入的地方。DaggerAppComponent.create().inject(this);。Dagger 在编译时生成实现,使得应用程序的依赖关系在编译期得以确保,避免运行时出现错误。此外,由于它在生成代码时是静态的,这意味着可以在生成的代码中进行优化,结果往往比反射实现更高效。
END
点赞转发,让精彩不停歇!关注我们,评论区见,一起期待下期的深度好文!