2012-03-22 91 views
10

我有一個名爲酒吧與以下標註類: @Configurable(autowire = Autowire.BY_TYPE)彈簧自動裝配和原型範圍

在一個私有成員,我有以下注釋:

@Autowired(required = true) 
private Foo foo; 

在春天的配置我有一顆豆Foo類。如果Bean與scope="prototype"定義它不工作,我得到以下異常:

NoSuchBeanDefinitionException:無類型的匹配豆富找到了依賴性: 預計將有至少1 Bean上有資格作爲自動裝配候選人,這依賴

一旦我改變注入豆範圍"singleton"它工作正常。

是否允許自動接線原型範圍的bean?

是否有任何解決方法(除了手動獲取bean)?

由於提前, 阿夫納

+0

相關:http://stackoverflow.com/questions/27776672/spring-protype-scope-behaviour/27782040#27782040 – 2015-01-07 12:45:16

回答

9

以下鏈接爲這樣的場景提供替代解決方案:

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/

有關添加foo第一個聯繫洽談:

@Component 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype") 
class Foo 

,這將導致每個呼叫都有一個新實例。

+0

這很好,你寫了什麼,但它會更好,如果你只是寫,配置它與代理是必需的:) – tomekK 2016-05-13 05:53:37

+0

只有鏈接的答案是壞的,如果給定的鏈接消失會發生什麼? – 2016-06-24 14:51:40

-1

如果注入的bean的範圍是「單身」,bean的同一實例會自動連線。如果注入的bean作用域是'prototype',那麼將創建新的實例作爲auto-wire進程的一部分。

您正在使用哪個版本的Spring,並附加spring-context.xml以獲取更多詳細信息。

+1

我知道原型和singleton之間的差異,我只是不明白爲什麼應該bean範圍對自動佈線有影響。我使用spring 3. – 2012-03-22 11:55:50

0

我相信它的原型/ singleton在你的xml中聲明的bean是這個問題。

是否允許自動接線原型範圍的bean?

我認爲這是不允許的。邏輯是,如果它被允許,那麼無論何時使用該類,那麼它就需要重新實例化該bean始終作爲其字段。這很奇怪,特別是如果這個bean作爲一個字段自動裝配的類是一個單身本身。

是否有任何解決方法(除了手動獲取bean)?

只要嘗試刪除範圍屬性,如果它是原型屬性,將不會被檢索。如果在applicationContext中聲明瞭這些bean(服務和DAO),那麼只需讓autowire註解將其作爲單例註冊即可,因爲默認情況下bean是單例的,應該是singleton。

+0

感謝您的回答,但刪除scope屬性不會修復我的代碼,因爲所有Bar實例將共享相同的Foo實例,這不是我所需要的。另外,Foo實例應該在每個Bar對象創建/注入時實例化一次,而不是每個字段的用法(就我的理解而言)。 – 2012-07-18 06:33:12

+0

我不知道是否有替代您的具體設計,告訴我,如果有。但就設計而言,bean應該以無狀態的方式使用,這意味着在你的領域要小心,確保在這些bean中使用的字段不是全局字段,而是方法字段,這種方式甚至是單例,你贏了不用擔心它是否被許多類共享,因爲沒有共享全局變量,因爲它是無狀態的。 – vine 2012-09-25 07:56:46

-2

或者您可以簡單地使用新的操作符。

+1

這完全破壞了DI和IOC的全部目的。 – csmckelvey 2017-07-12 20:36:04