使用Spring在Java中创建运行时对象

时间:2013-12-14 08:10:40

标签: java 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(...),

我如何实现这一目标?我可以通过条件bean实现这个目标吗?

请帮忙。

4 个答案:

答案 0 :(得分:1)

我认为您正在寻找像@Profile annotation of Spring这样的东西。这样,您可以对类型MyInterface的bean进行两种定义,并通过在程序启动时传递profile参数来加载适当的bean。

你的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>

答案 1 :(得分:1)

您可以将bean定义放在不同的配置文件中,并根据env变量导入配置。

在主spring config xml中,您将添加以下导入:

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

那么您将拥有两个(或更多)beans_*.xml个文件(beans_a.xmlbeans_b.xml

答案 2 :(得分:0)

您可以在服务器正常运行时实例化两个对象,并使用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")
}

答案 3 :(得分:0)

你可以使用Spring的Profile概念来做到这一点。

Oy你也可以通过用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()