【发布时间】:2022-10-24 15:53:44
【问题描述】:
我有一个标准的 Spring Boot MVC 应用程序,其中包含许多实体以及相应的存储库和服务。组件之间共享了很多基础架构,因此我想将其抽象为泛型类。我目前试图实现的方式是这样的(只显示骨架来传达这个想法):
interface AbstractRepository<T> {
fun findById(entityId: Long): T
}
abstract class AbstractEntityService<T>(
private val entityRepository: AbstractRepository<T>,
) {
fun getEntity(entityId: Long): T = entityRepository.findById(entityId)
}
@Repository
interface MyRepository : AbstractRepository<MyEntity>
@Service
class MyEntityService(
myRepository: MyRepository,
/* some other dependencies */
) : AbstractEntityService<MyEntity>(myRepository) {
/* some additional methods */
}
这似乎可行,即我可以实例化(或自动装配)MyEntityService。但是请注意,我必须将 MyRepository 显式传递给构造函数,而不是让 Spring 自动装配它。由于运行时类型擦除,这是不可能的。但到目前为止,它并没有给我带来太多困扰。
当我想向 AbstractEntityService 添加一些需要其他 bean 的逻辑时出现问题,即类似这样的东西
@Service
abstract class AbstractEntityService<T>(
private val entityRepository: AbstractRepository<T>,
) {
@Autowired
private lateinit var otherService: OtherService
fun getEntity(entityId: Long): T
fun commonMethodUsingOtherService(): T
}
但是现在我遇到了一个问题,因为为了自动装配OtherService,我必须使我的抽象服务成为一个 Spring 组件 (@Service),它具有 Spring 试图注入在我的构造函数中声明的 AbstractRepository<T> 的不良副作用。由于上面提到的类型擦除,它找到了很多 AbstractRepository 类型的 bean 并且失败了。
我的问题: 如何说服 Spring 不要将 bean 注入我的 AbstractEntityService 构造函数?
相关问题:对于我的问题(在第一段中提到)是否有技术上不同的解决方案,可以避免可能的框架限制/缺点? IE。不使用继承,以不同的方式构造我的代码等。
【问题讨论】:
标签: java spring kotlin dependency-injection