2016-04-28 38 views
0

假設,有以下代碼:依賴注入由條件中運行時

@RestController 
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
class Controller { 

    /* inject here */ 
    public @NonNull GenericService service; 

    public void doo(List<GenericDTO> list, String type) { 
     service.doo(list); 
    } 

} 

class GenericDTO { ... } 
class GenericService { ... } 

class OfferService extends GenericService { ... } 
class OtherService extends GenericService { ... } 

如果typedoo方法是等於"offer",我要注入的OfferService實例service。如果我收到"other",我必須使用OtherService,依此類推。那可能嗎?

+1

那麼,沒有。這是一個單一的領域。它將被注入一次(如果它是單身bean)。注入邏輯將無法訪問方法調用中存在的值。只需注入兩個服務並使用「if」來決定。或者,創建一個Map來根據密鑰類型選擇合適的服務。 –

回答

2

我假設你所有的bean都是單身人士。

在應用程序啓動時發生的上下文初始化期間,單例bean都被初始化和注入,你的doo方法(我假定它是一個處理程序方法)尚未被調用。 Spring沒有辦法猜測/知道調用某種方法的可能值是什麼,或者這些值如何以任何方式影響目標註入點。

也許代理可以幫助和確定在調用doo什麼真正的豆得到。這很難,因爲您必須以某種方式將type的值暴露給解析的任何組件。春天不可能做到這一點。你必須寫自己的作品才能做到這一點,可能需要你自己的Scope實施的幫助。 (這不是微不足道的。)

最簡單的解決方案是注入兩種服務,只需在type上注入if-else/switch並相應地選擇一個。或者把兩項服務都放在Map之內,type是關鍵。