2013-07-18 41 views
0

我已經將我的代碼從Spring的XML配置移到了Java配置中。我有一切工作,但我有一個關於我如何實現原型bean的問題 - 主要是,雖然我在做什麼工作,它是做到這一點的最佳方式?不知何故,它感覺不到!Spring的Javaconfig和原型豆

我寫的bean類是這樣的:

@Component 
@Scope("prototype") 
public class ProtoBean { 
    ... 
} 

然後用豆 - 這是我只是不知道的一部分,儘管它的工作:

@Component 
public class BeanUser implements ApplicationContextAware { 
    ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext context)throws BeansException 
    { 
     this.context = context; 
    } 

    public void getProtoBean() { 
     ProtoBean protoBean = context.getBean(ProtoBean.class); 
    } 
} 

這給我一個原型bean,在單元測試中,我只是嘲笑上下文,用模擬器調用setApplicationContext,並且模擬器的getBean調用返回一個模擬ProtoBean。所以一切都很好。

我在XML中使用了一個工廠來完成這項工作,但這似乎沒有工作得太好,所以這就是我最終選擇的地方。但是有沒有辦法做到這一點沒有上下文?或者只是一個更好的方法?

謝謝!

+0

您目前沒有使用基於Java的配置。看看這裏http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java – Bart

+0

這是一個有趣的鏈接 - 謝謝。我正在使用@ComponentScan在我的java配置類中選擇它,所以它看起來似乎以相同的方式工作,有趣的是,這與他們給出的第一個例子相匹配 - 然後他們繼續談論「方法注入」這似乎是他們建議的解決方案。 謝謝! –

回答

1

我不認爲是Spring XML與基於Java的配置的問題,而是匹配依賴範圍之一。由於Spring只能在創建時對單例作用域bean執行依賴注入,所以你必須按需查找原型作用域的bean。當然,當前的bean查找方法起作用,但會在ApplicationContext上創建依賴關係。我可以提出其他一些可能性,但問題的根源實際上是生產ProtoBean的原因,以及您應該接受什麼樣的折衷。

您可以使BeanUser本身的原型範圍,這將允許您在ProtoBean作爲成員連線。當然,權衡是你現在對BeanUser的客戶端有同樣的問題,但有時這不會是一個問題。

另一條路徑可能使用類似於單例作用域的ProtoBeanFactory來提供ProtoBean實例,並在ProtoBeanFactory中隱藏依賴關係查找。

最後,您可以使用scoped-proxy bean來有效地隱藏工廠。它使用AOP來做到這一點,並不總是讓別人清楚你有什麼樣的巫術。使用XML,你可以在bean聲明上使用<aop:scoped-proxy/>。對於您要使用的註釋:

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