在工厂类中将特定于某些实现的对象作为成员变量是一种好习惯吗? 例如,在下面的代码中,分别构造OneChannel和secondChannel对象需要s1和s2。在工厂内将这些声明为成员变量是一种好习惯吗?如果没有,那么另一种选择又是什么。
public class CommunicationChannelFactoryImpl {
@Autowired
SomeClass s1;
@Autowired
SomeOtherClass s2;
public CommunicationChannel getCommunicationChannel(String channel, Map<String, String> channelProperties) {
if(channel.equals("ONE") {
return new OneChannel(s1);
}
if(channel.equals("TWO") {
return new SecondChannel(s2);
}
}
}
请注意,s1 ad s2是单身豆
答案 0 :(得分:1)
由于您需要这些bean来构建这些特定的通道实现,我认为您可以将它们作为特定工厂实现中的属性。您正在注入所需的组件,因此您可以根据需要灵活地更改实现。
此外,如果SomeClass
和SomeOtherClass
是一些抽象/接口/超类型,那将会更好。通过这种方式,如果您将来需要提供不同的实现来构建这些通道对象,您将能够非常轻松地完成这些操作。
答案 1 :(得分:0)
为什么不让Spring使用BeanFactoryAware
创建OneChannel()和SecondChannel()对象?
public class CommunicationChannelFactoryImpl implements BeanFactoryAware {
FactoryBean factoryBean;
public void setBeanFactory(FactoryBean factoryBean) {
this.factoryBean = factoryBean;
}
public CommunicationChannel getCommunicationChannel(String channel, Map<String, String> channelProperties) {
if(channel.equals("ONE") {
return this.factoryBean.getBean("oneChannel");
}
if(channel.equals("TWO") {
return this.factoryBean.getBean("secondChannel");
}
}
}
并将您的XML(或JavaConfig,但我没有使用它)定义为:
<bean id="oneChannel" scope="prototype">
<constructor-arg index="0" ref="s1" />
</bean>
<bean id="secondChannel" scope="prototype">
<constructor-arg index="0" ref="s2" />
</bean>
<bean id="s1" class="path.to.SomeClass" />
<bean id="s2" class="path.to.SomeOtherClass" />