使用自动装配在春天注入豆

时间:2015-07-16 14:35:46

标签: spring spring-bean

我的界面

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;

我想知道什么是正确的方法。任何想法。?

1 个答案:

答案 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网站上使用的文档,我猜不支持使用对象参数类型实现自动装配,因为它是较差的选项。

Spring Autowiring Generics