對於@Bean注入的新理解

浮白呀發表於2024-10-23

最近在專案中看到別人的程式碼是莫名奇妙就有值了,不理解原理,現在已經查明瞭

示例:

@Service
public class DefaultChainFactory {
    private final Map<String, ILogicChain> logicChainGroup;
    protected IStrategyRepository repository;

    public DefaultChainFactory(Map<String, ILogicChain> logicChainGroup, IStrategyRepository repository) {
        this.logicChainGroup = logicChainGroup;
        this.repository = repository;
    }

    /**
}
@Resource
    private DefaultChainFactory defaultChainFactory;
 @Test
    public void test_LogicChain_rule_blacklist() {
        ILogicChain logicChain = defaultChainFactory.openLogicChain(100003L);
        Integer awardId = logicChain.logic("user001", 100003L);
        log.info("測試結果:{}", awardId);
    }
在此求值的話會發現,我們並沒有呼叫建構函式,但是它裡面的map卻有值

如何解釋呢

型別匹配:Spring 在初始化 DefaultChainFactory 時,會檢查建構函式的引數型別。如果引數型別是 Map<String, ILogicChain>,Spring 會查詢所有實現了 ILogicChain 介面的 bean,將它們放入這個 Map 中。

沒有匹配:如果建構函式的引數型別不匹配,例如如果你將引數型別定義為 List<ILogicChain> 或其他型別,Spring 將無法自動填充這個引數。在這種情況下,logicChainGroup 將保持為 null(如果沒有預設值的話)或在編譯時可能會報錯,取決於具體的型別和上下文。

自動裝配:這個自動裝配過程依賴於 Spring 的依賴注入機制。只要型別匹配,Spring 就會負責管理和賦值;如果型別不匹配,它就無法找到合適的 bean 來注入。

相關文章