2011-12-17 199 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