假设我有两个类,即用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实现这个目标吗?
请帮忙。
答案 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.xml
和beans_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()