Spring 如何在工厂方法中获取bean id?
配置Spring 如何在工厂方法中获取bean id?,spring,Spring,配置 <bean id="carFactory" class="CarFactory" /> <bean id="ford" factory-bean="carFactory" factory-method="createCar"/> <bean id="carFactory" class="CarFactory" /> <bean id="ford" class="CarProducer"/> 如何打印ford?工厂方法用于创建对象,它替换构
<bean id="carFactory" class="CarFactory" />
<bean id="ford" factory-bean="carFactory" factory-method="createCar"/>
<bean id="carFactory" class="CarFactory" />
<bean id="ford" class="CarProducer"/>
如何打印ford?工厂方法用于创建对象,它替换构造函数调用。当您告诉Spring factory method=“createCar”时,您是在告诉它需要调用createCar来创建bean ford createCar方法打印汽车的名称,但属性尚未设置,因此它应该打印为null 我建议您使用构造函数arg向createCar方法传递参数
<bean id="ford" factory-bean="carFactory" factory-method="createCar">
<constructor-arg value="ford"/>
</bean>
reos的解决方案正在运行,但我不能接受重复,所以我应用了其他解决方案 配置
<bean id="carFactory" class="CarFactory" />
<bean id="ford" factory-bean="carFactory" factory-method="createCar"/>
<bean id="carFactory" class="CarFactory" />
<bean id="ford" class="CarProducer"/>
代码
公共类CarProducer扩展AbstractFactoryBean实现BeanNameWare{
公共字符串carName;
@重写public void setBeanName(字符串名){carName=name;}
@自连线私人汽车制造厂;
@Override protected Car createInstance()引发异常{
System.out.println(carName);//打印福特
返回工厂。createCar(卡纳姆);
}
(...)
}
您将无法做到这一点,只能从车内执行BeanNameAware
。太遗憾了!请按常规回答,给我机会接受。顺便说一句,在我的例子中,我需要工厂方法中的car name,因为它对createCar
算法有影响。请参见@reos的答案。您可以使用工厂方法,它接受1个或多个参数,并使用构造函数arg
元素传入参数。它可以工作,但“ford”使用了两次。在我的项目中,我有十几辆汽车。我宁愿被炒鱿鱼,告诉我的团队每个标记都要写两遍。嗯,我不明白你为什么说福特车用了两次。id=“ford”。。。value=“福特”。我的例子:遗留代码取决于bean id,我希望保持它不变。我可以简化代码,因为bean id可以直接映射到文件名。所以我想在汽车工厂里读一下bean id(汽车id),但我不想重复福特、丰田等的两遍。
public class CarProducer extends AbstractFactoryBean<Car> implements BeanNameAware {
public String carName;
@Override public void setBeanName(String name) { carName= name;}
@Autowired private CarFactory factory;
@Override protected Car createInstance() throws Exception {
System.out.println(carName); // prints ford
return factory.createCar(carName);
}
(...)
}