我很难搞清楚这一点,我首先要提到的是班级结构:
CarFactory类有一个工厂方法,它返回一辆汽车。在spring.xml文件(test-spring.xml)中,bean定义如下所示:
<bean id="carDealer" class="...CarDealer>
<property name="car" ref="car"/>
</bean>
<bean id="carFactory" class="...CarFactory" />
<bean id="car" factory-bean="carFactory" factory-method="createCar" />
<bean id="tire" class="...Tire" />工厂将返回一个RedCar或BlueCar,调用代码不知道是哪个。但是,假设在这个示例中,它返回RedCar。
在测试类中,我正在测试RedCar,它的设置如下:
@SuppressWarnings("PMD")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-spring.xml" })
public class RedCarTest {
@Autowired
Car redCar;在RedCar类中,它的属性为Tire:
public RedCar implements Car {
@AutoWired
private Tire tire;
}在测试示例中,这很好,从工厂返回的redCar也是用它的依赖项轮胎初始化的。问题是当我试图在我的应用服务器上运行这个程序时。
在应用程序代码中,CarDealer类具有对Car的引用:
public CarDealer {
private Car redCar;
}当调用此代码时,将创建CarDealer (按spring),并创建Car (按弹簧),但是Car的Tire属性为null。我不明白为什么在测试代码下创建了Tire属性,但是在应用程序中却没有。希望这是一个比以前提出的问题更清楚的问题。
发布于 2013-04-24 18:44:37
当工厂返回一个Car ("RedCar")时,如何确保对依赖属性进行初始化。
@Autowired无法工作,因为您的工厂类正在实例化bean本身,因此Spring只能在创建bean时自动创建依赖项(并对注释进行操作)。
确保工厂返回的对象拥有其所有属性的最简单方法是设置工厂类/方法中的所有属性。
因此,实际上,工厂可以有一个SomeRedProperty字段,以便将其传递给它创建的RedCar。
发布于 2013-04-24 18:36:41
您是否尝试使用@Resource(name="SomeRedProperty")而不是使用@Autowired
发布于 2013-04-24 19:53:16
我同意@matt b,确保所有的属性都可以由您自己在工厂内完成。但是,如果您确实希望Spring管理Blue和Red Car实例的依赖关系,则可以执行以下步骤:
setBeanFactory(BeanFactory beanFactory),只需保存对bean工厂的引用。createCar方法中,一旦决定了要返回哪辆汽车,就从bean工厂查找适当的bean并返回给调用者。希望这能有所帮助。
https://stackoverflow.com/questions/16199490
复制相似问题