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
相关产品推荐
相关产品推荐

