我有以下代码
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()}
感谢您的期待。
答案 0 :(得分:1)
对于@Bean方法,它是重要的返回类型。即使你可能从一个方法返回一个TopLinkRepository,而从另一个方法返回一个HibernateRepository,但是从容器的角度来看,它只知道有两个类型为IRepository的bean,因此不明白一个是@Toplink注释,一个是@Hibernate注释。
你有几个选择。考虑到您当前的配置,最简单的方法是更改返回类型以使其更具体。
第二种方法是保留返回类型的通用性,但将@Toplink和@Hibernate限定符注释移动到@Bean方法级别。
第三种是对存储库类型进行组件扫描,而不是将它们声明为@Bean方法。
通常建议使用第三种方法,因为您已经在存储库组件上使用了@Inject,并将它们标记为@Named。这使得它们首先成为组件扫描的理想选择。查看@ComponentScan的Javadoc以了解如何在@Configuration类世界中执行此操作。