You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何给抽离的公共方法类依赖注入userRepository

解决方案

伴生对象属于类级别的静态资源,生命周期和Spring托管的实例Bean完全不匹配,天生不适合承载需要依赖注入的业务逻辑,最优方案是直接将公共方法类改造为Spring托管的组件,完全适配Spring的注入体系:

步骤1:改造公共方法类

给公共类添加@Component注解,将方法从伴生对象迁移到类实例层级,通过构造注入所需的依赖(Spring官方更推荐构造注入,比字段注入更易测试、更安全):

@Component
class CommonMethods(
    private val userRepository: UserRepository
) {
    fun firstValidationField(input: User): User {
        // 原有业务逻辑不变
        input.timezone = userRepository.getTimezone(input.userId)
        return input
    }
    
    // 其余公共方法同理迁移
}

步骤2:在业务服务中注入调用

在两个需要复用逻辑的@Service类中,直接注入CommonMethods实例即可调用公共方法:

@Service
class FirstBusinessService(
    private val commonMethods: CommonMethods
) {
    fun testBiz(input: User) {
        // 直接调用公共方法
        val processedUser = commonMethods.firstValidationField(input)
        // 后续业务逻辑
    }
}

@Service
class SecondBusinessService(
    private val commonMethods: CommonMethods
) {
    // 调用方式和上面一致
}

不推荐的兼容方案

如果必须保留伴生对象的调用形式(仅作为临时兼容方案,不建议生产使用),可以通过实现ApplicationContextAware手动获取Spring上下文,在伴生对象中静态持有上下文后主动拉取userRepository实例,但这种方案无法做单元测试Mock,依赖耦合度极高,仅做参考不推荐使用。

内容的提问来源于stack exchange,提问作者LeaL L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:39:01