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);
    }
    (...)
}