最近在專案中看到別人的程式碼是莫名奇妙就有值了,不理解原理,現在已經查明瞭
示例:
@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 來注入。