问题预选赛泛型类型已经确定,公布更新后的(滚动到底)弹簧4不会自动自动装配
我开发目前使用Spring(spring-context
,4.1.6.RELEASE
)为国际奥委会和依赖注入的桌面应用程序。我正在使用注释配置,使用@ComponentScan
。我遇到的问题应该作为4.X.X
中的一项功能实施,因为它表示here和here,但我收到了旧的3.X.X
异常。
我有一个参数化接口,它表示一个通用的存储库:
public interface DomainRepository<T> {
T add(T entity) throws ServiceException, IllegalArgumentException;
// ...etc
}
我然后具有该两个具体的实现,ChunkRepositoryImpl
和ProjectRepositoryImpl
,它们相应地参数化。他们分享一个抽象类的一些常见的实现,但宣称像这样:
@Repository
public class ChunkRepositoryImpl extends AbstractRepositoryImpl<Chunk> implements DomainRepository<Chunk> {
// ...+ various method implementations
}
@Repository
public class ProjectRepositoryImpl extends AbstractRepositoryImpl<Project> implements DomainRepository<Project> {
// ...+ various method implementations
}
我上面的链接的理解使我相信,我应该能够自动装配这些无需通过@Qualifier
手动指定豆。然而,当我这样做:
@Autowired
private DomainRepository<Project> repository;
我得到下面的异常(前面加场的长堆栈跟踪):
产生的原因:org.springframework.beans.factory.NoUniqueBeanDefinitionException:无资格类型的豆[com.foo.bar.repositories.DomainRepository]定义:预期单个匹配的bean,但发现2:chunkRepositoryImpl,projectRepositoryImpl
任何人可以照亮一盏灯,为什么这可能发生?我希望这个例外在3.X.X
,但它不应该发生在4.X.X
。我的情况和描述的here之间有什么区别?
UPDATE
我已经发现了问题的根源。我的DomainRepository<T>
接口中的一种方法被标记为@Async
,并且利用了Spring的异步功能。删除这意味着这些bean是正确的。我假设Spring将类下的@Async
方法转换为其他类,并且这个过程去除了类型信息,这意味着它不能将bean分开。
这意味着我现在有两个问题:
- 这是预期的行为?
- 任何人都可以提出解决方法吗?
Here是一个展示问题的项目。只需从DomainRepository<T>
界面删除@Async
注释,问题就消失了。
这对我在4.x.x上正常工作。请发布完整且可重现的示例。 –
@SotiriosDelimanolis在一个不同的项目中创建一个可重复的例子,但到目前为止它也适用于我。但是,在原始项目中,异常仍然存在。这很混乱。 –
名称为'Project'的类在'repository'字段中被映射到类中吗? –