2011-12-17 212 views
2

我有以下代码javax.inject.Qualifier春季JavaConfig

的2场javax.Inject预选赛

@Qualifier 
@Target(value={ElementType.FIELD,ElementType.TYPE,ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Hibernate { 
--nothing goes here 
} 


@Qualifier 
@Target(value={ElementType.FIELD,ElementType.TYPE,ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Toplink{ 
--nothing goes here 
} 

我有资格的库

@Named 
@Hibernate 
public class HibernateRepository implements IRepository{ 
-- some code 
} 

@Named 
@Toplink 
public class ToplinkRepository implements IRepository{ 
-- some code 
} 

这些存储库是注入使用使用javax.Inject

public class InvoiceService { 
    @Inject 
    //@Hibernate I alternate between the two to test 
    @Toplink 
    private IRepository iRepository; 
    public void saveInvoice(Invoice invoice){ 
    iRepository.save(invoice); 
} 

以下配置类

@Configuration 
public class Myconfig { 

    @Bean 
    public IRepository getHibernateRepository(){ 
     return new HibernateRepository(); 
    } 

    @Bean 
    public InvoiceService getInvoiceService(){ 
     return new InvoiceService(); 
    } 

     @Bean 
     public IRepository getToplinkRepository(){ 
     return new ToplinkRepository(); 
    } 

} 

此代码工作完全正常,当我使用XML配置,任何想法如何得到它与javaConfig工作?或者在我的代码中有什么根本错误?使用时它抛出以下异常

异常线程“main” org.springframework.beans.factory.BeanCreationException:错误 创建名为“getInvoiceService”豆:自动装配 依赖注入失败;嵌套的异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire字段:private com.domain.IRepository com.service.InvoiceService.iRepository;嵌套的异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:无类型[com.domain.IRepository]的 匹配豆找到依赖性: 预期至少1豆,其有资格作为自动装配候选 这种依赖性。依赖注解:{@ javax.inject.Inject(), @ com.domain.Toplink()}

感谢期待。

回答

1

在@Bean方法的情况下,它是计数的返回类型。即使你可能从一个方法返回一个TopLinkRepository,而从另一个方法返回一个HibernateRepository,但从容器的角度来看,它只知道有两个类型为IRepository的bean,因此不了解其中一个是@Toplink注释的,一个是@Hibernate注释。

这里有几种选择。根据您当前的配置,最简单的方法是更改​​返回类型以使其更具体。

第二种是让返回类型通用,但将@Toplink和@Hibernate限定符注释移至@Bean方法级别。

第三种方法是对存储库类型进行组件扫描,而不是将它们声明为@Bean方法。

第三种方法通常是建议的,因为您已经在存储库组件上使用了@Inject,并且使用@Named标记了它们。这使得他们首先成为组件扫描的自然人选。查看@ComponentScan的Javadoc以查看如何在@Configuration类世界中执行此操作。

+0

你确定Spring(3.1)支持'@ Bean'方法中的_javax.inject.Qualifier_吗?我目前正在努力解决同样的问题,因为我想以编程方式实例化通用存储库,并且在@ @ Configuration'中使用“@Bean @ MyQualifier”创建bean时,“@Inject @ MyQualifier”不起作用类。 – Robin 2013-02-04 16:23:59