2017-05-16 56 views
4

我試圖創建一個Component這將是Autowired除非用戶創建一個不同的實現。 我用下面的代碼,試圖隔離問題:如何在Spring中創建默認的可覆蓋組件?

接口:

public interface A {...} 

實施:

@Component 
@ConditionalOnMissingBean(A.class) 
public class AImpl implements A {...} 

的使用代碼:

public class AUsage { 
    @Autowired 
    private A a; 
} 

在這例如,我沒有將AImpl自動裝入AUsage。 如果我在另一個班級實施A而沒有ConditionalOnMissingBean它可以工作。

+2

當然,爲了這個工作,'AUsage'也必須是一個Spring bean。在上面的例子中,它沒有'@ Component'註釋。你忘了複製並粘貼到你的問題?如果沒有注入「AImpl」,那麼它很可能在未被組件掃描的包中。確保包含'AImpl'的軟件包包含在組件掃描中。 – Jesper

+0

'如果我在沒有ConditionalOnMissingBean的情況下在另一個類中實現A,它就會起作用。「以及如果從上面的代碼中刪除_ConditionalOnMissingBean_批註,該怎麼辦?如果bean仍未被自動裝配 - 看起來問題與@Jesper描述的smth有關 – bsiamionau

+0

AUsage有一個@ Component組件註解,但我隱藏它來隔離問題。 – orirab

回答

0

我試着從互聯網上覆制@ConditionalOnMissingBean的現有用途,並注意到它們都引用了@Bean方法。

事實上,當我加入這個代碼AUsage:

public class AUsage { 
    @Autowired 
    private A a; 

    @Bean 
    @ConditionalOnMissingBean 
    public A createA() { 
     return new AImpl(); 
    } 
} 

並已刪除的AIMP1註釋:

public class AImpl implements A {...} 

一切正常。

如果有人知道,我很樂意爲您解釋這一點。

相關問題