3

是否有可能在運行時使用Spring中的註釋將原型有限區域bean的新實例注入Controller的方法參數?所以無論什麼時候調用該方法,Spring都會注入符合條件的Bean作爲它的參數,熟悉地注入@ModelAttribute。據我所知,創建上下文時@Autowired域只被注入一次。從上下文的工廠方法中獲取bean不是一種選擇,因爲這會將框架暴露給它的組件,因此違反了好萊塢原則。是否有可能在運行時在Spring中自動裝入方法參數

我幾乎已經閱讀了Spring in Action的書,並且一直在閱讀Spring Reference,但是還沒有找到關於這個問題的任何信息。

+0

爲什麼你想在那裏注入原型?這看起來像是一種代碼味道。 (如果它真的是合理的,你可以注入一個工廠,而不是生產的bean。) – chrylis

回答

1

您有幾個選項。

定義一個bean原型,並注入該包裹在ObjectFactory

@Autowired 
private ObjectFactory<PrototypeBean> factory; 

然後,您可以在您的處理程序方法檢索它。例如

@RequestMapping("/path") 
public String handlerMethod() { 
    PrototypeBean instance = factory.getObject(); 
    instance.someMethod(); 
    return "view"; 
} 

每次調用factory.getObject()時候,你會得到一個新的實例。

至於直接做這件事,不,Spring MVC沒有一個內置的功能,用於在調用處理程序方法時注入Bean,使用@Autowired或其他方法。

但是,HandlerMethodArgumentResolver API允許您爲所需的任何類型的參數定義實現。您可以定義一個新的註釋並使用它來註釋適當的處理程序方法參數。該實現將查找註釋並從注入的ApplicationContext解析實例。不管你想要什麼,你都可以按名稱,類型來做到這一點。

+0

我把'ObjectFactory'和'@ ModelAttribute'結合起來,它的工作原理是例外的,謝謝。我還發現了另一種名爲'Provider'的JSR標準接口。甚至發現'@ Lookup',但它感覺不太直覺 –

+0

我進一步嘗試了'HandlerMethodArgumentResolver',並最終設法在將它聲明爲'component'之後立即工作,以便我可以將它與'context'綁定,並且然後將自動裝配的實例手動添加到'WebMvcConfigurerAdapter'中的解析器列表中。它是遺留類,還是我爲什麼不能將它定義爲一個bean,並讓Spring檢測它並將其集成到它的基礎結構中,例如ViewResolvers等? –

相關問題