簡體   English   中英

使用Spring在Java中創建運行時對象

[英]Runtime object creation in Java using Spring

假設我有兩個用Java定義的類,即MyRealClass和MyMockClass。 它們都實現相同的接口,即MyInterface。

現在,我需要根據條件(在我的spring config xml文件中可用的變量)實例化任一類的對象,如下所示:

if ${env} = 'A', then do, MyInterface mObj = new MyMockClass(...),
if ${env} = 'B', then do, MyInterface mObj = new MyRealClass(...),

我該如何實現? 我可以通過條件豆來實現嗎?

請幫忙。

我認為您正在尋找類似Spring@Profile注釋的東西。 這樣,您可以對MyInterface類型的bean進行兩個定義,並在程序啟動時通過傳遞profile參數來加載相應的定義。

您的XML如下所示:

<beans profile="A">
     <bean id="myMock" class="MyMockClass" />
</beans>
<beans profile="B">
     <bean id="myReal" class="MyRealClass" />
</beans>

然后,必須使用系統屬性-Dspring.profiles.active=A啟動應用程序,或者如果您在Web應用程序中,則必須直接在web.xml指定它:

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>A</param-value>
</context-param>

您可以將bean定義放在不同的配置文件中,然后根據env變量導入配置。

在您的主要spring config xml中,您將添加以下導入:

<import resource="classpath:beans_${env}.xml" />

那么您將擁有兩個(或更多) beans_*.xml文件( beans_a.xmlbeans_b.xml

您可以使用Spring Bean工廠在服務器正常運行時實例化兩個對象,並根據環境注入對象。

If(env==='A'){
MyInterface mObj = SpringFactory.getBean("id defined in xml for mock clas")
}else if((env==='B'){
MyInterface mObj = SpringFactory.getBean("id defined in xml for real class")
}

您可以使用Spring的Profile概念來做到這一點。

還可以通過使用lazy-init="true"創建兩個bean,然后將它們包裝在另一個bean中來做到這一點

<bean id="myClassFactory" class="MyClassFactory">
    <property name="myObject" ref="myClass${env}" />
</bean>

<bean id="myClassA" class="MyMockClass" lazy-init="true" />
<bean id="myClassB" class="MyRealClass" lazy-init="true" />

然后,您只需要調用MyClassFactory.getMyObject()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM