javax.inject.Qualifier Spring JavaConfig

时间:2011-12-17 13:17:57

标签: annotations jsr330

我有以下代码

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'的bean:注入自动装配   依赖失败;嵌套异常是   org.springframework.beans.factory.BeanCreationException:不能   autowire字段:private com.domain.IRepository   com.service.InvoiceService.iRepository;嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   为依赖项找到匹配的[com.domain.IRepository]类型的bean:   预计至少有1个豆有资格成为autowire候选人   这种依赖。依赖注释:{@ javax.inject.Inject(),   @ com.domain.Toplink()}

感谢您的期待。

1 个答案:

答案 0 :(得分:1)

对于@Bean方法,它是重要的返回类型。即使你可能从一个方法返回一个TopLinkRepository,而从另一个方法返回一个HibernateRepository,但是从容器的角度来看,它只知道有两个类型为IRepository的bean,因此不明白一个是@Toplink注释,一个是@Hibernate注释。

你有几个选择。考虑到您当前的配置,最简单的方法是更改​​返回类型以使其更具体。

第二种方法是保留返回类型的通用性,但将@Toplink和@Hibernate限定符注释移动到@Bean方法级别。

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

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