运行时获取依赖 → 编译时注入

运行时获取依赖 → 编译时注入

老写法(Java --- 运行时获取)

java 复制代码
//  Service Locator 模式
public class ServiceLocator {
    private static Map<Class<?>, Object> services = new HashMap<>();

    public static <T> void register(Class<T> type, T instance) {
        services.put(type, instance);
    }

    public static <T> T get(Class<T> type) {
        return (T) services.get(type);
    }
}

ServiceLocator.register(ApiService.class, apiService);
ApiService api = ServiceLocator.get(ApiService.class);

//  反射创建
ApiService api = (ApiService) Class.forName("com.example.ApiService").newInstance();

问题在哪里

Service Locator 是运行时查找依赖,类型匹配失败编译期不报错。HashMap<Class<?>, Object> 是 Object 类型,每次 get 都要强转。依赖缺失或循环依赖的 bug 只在运行时暴露。

新写法(Hilt --- 编译时注入)

kotlin 复制代码
// 所有依赖关系在编译期确定,不会运行时找不到
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Provides @Singleton
    fun provideApi(retrofit: Retrofit): ApiService =
        retrofit.create(ApiService::class.java)
}

// 使用时 --- 编译期检查依赖是否可用
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var api: ApiService
}

一句话注意

编译时 DI(Hilt/Dagger)和运行时 DI(Koin/Service Locator)的核心区别:编译时 DI 的依赖图在构建阶段就校验好,依赖缺失直接编译报错;运行时 DI 直到执行时才发现问题。对大型项目来说,编译时报错 vs 线上崩溃是天壤之别。

Hilt 的代价是编译速度和配置复杂度,Koin 的代价是运行时风险和轻微性能损失。选哪个取决于项目规模和团队偏好------小型项目或需要快速迭代的阶段,Koin 够用;大型项目或对稳定性要求高的,选 Hilt。


Java Android 老项目迁移系列,持续更新中。

相关推荐
晚风叙码8 分钟前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
cpolar技术支持27 分钟前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
wuminyu30 分钟前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
传奇开心果编程32 分钟前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
小蒜学长39 分钟前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔1 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
殷色玫瑰2 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同2 小时前
java输入输出+方法
java·开发语言·python
Yyyyyy~2 小时前
【Java】String
java
事圆则缓2 小时前
Kotlin 入门与面试:从空安全、扩展函数到协程
安全·面试·kotlin