我的界面
public interface IProcessContextFactory<U, T> {
public IProcessContext<U> createContext(T data);
}
@Component("PricingProcessContextFactory")
public class PricingProcessContextFactory implements IProcessContextFactory<OrderEntity, OrderEntity> {
@Override
public IProcessContext<OrderEntity> createContext(final OrderEntity data)
{
..........
}
}
现在,如果我按照这个春天注入Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [......IProcessContextFactory]
@Autowired
@Qualifier(value = "PricingProcessContextFactory")
private IProcessContextFactory<Object, Object> processContextFactory;
我想知道什么是正确的方法。任何想法。?
答案 0 :(得分:0)
在Spring 4中,可以通过参数类型声明进行自动装配。如果使用Generics接口,则不需要限定符:
@Autowired
private IProcessContextFactory<OrderEntity, OrderEntity> processContextFactory;
这是最不可能的耦合,因为您可以使用相同的参数添加模拟实现并改为使用autowire mock。
使用限定符,可以直接依赖具有给定名称的特定bean。
作为另一件需要考虑的事情,你必须明确地转换为OrderEntity
,这种方式会杀死参数化界面。
但是,您也可以使用限定符和具体类型来执行此操作,但这是reudndant:
@Autowired
@Qualifier("PricingProcessContextFactory")
private IProcessContextFactory<OrderEntity, OrderEntity> processContextFactory;
至于为什么你的例子不起作用,虽然看起来应该如此,但我会给你最好的猜测,但我不能用一些来源支持这个。
想象一下,如果您有两个Generic接口的实现,并且每个实现都是@Service
,其中包含一些名称和数据类型。
当你自动实现用Object参数化的Generic接口时,Spring有两个可能的实现候选者。 Spring知道在这里注入哪个bean的唯一方法是使用限定符名称。
由于已经存在按类型解析通用接口实现的机制,因此必须优先使用限定符并使用它来代替类型声明。但由于数据类型声明的autowire提供了更低的耦合,这就是它应该在Spring网站上使用的文档,我猜不支持使用对象参数类型实现自动装配,因为它是较差的选项。