0

我很难弄清楚这一点,我将首先提到类结构:

  • 汽车经销商
  • 汽车厂
  • 汽车(接口)
  • BlueCar(汽车的实现)
  • RedCar(汽车的实现)

CarFactory 类有一个返回 Car 的工厂方法。在 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 类中,它具有轮胎的属性:

public RedCar implements Car {
    @AutoWired
    private Tire tire;
}

在测试示例中,这工作正常,从工厂返回的 redCar 也被初始化,它的依赖项 Tire 也被初始化。问题是当我尝试从我的应用服务器运行它时。

在应用程序代码中,CarDealer 类引用了汽车:

public CarDealer {
    private Car redCar;
}

调用此代码时,将创建 CarDealer(通过 spring)并创建 Car(通过 spring),但是 Car 的 Tire 属性为 null。我不明白为什么在测试代码下会创建 Tire 属性,但在应用程序中却没有。希望这是一个比之前提出的问题更清晰的问题。

4

3 回答 3

1

您是否尝试过使用@Resource(name="SomeRedProperty")而不是@Autowired

于 2013-04-24T18:36:41.467 回答
0

当工厂返回汽车(“RedCar”)时,如何确保初始化依赖属性。

@Autowired不起作用,因为您的工厂类正在实例化 bean 本身,Spring 在创建 bean 时只能自动装配依赖项(并作用于注释)。

确保工厂返回的对象具有所有属性集的最简单方法是设置工厂类/方法中的所有属性。

所以实际上,工厂可以有一个SomeRedProperty字段,用于将它传递给RedCar它创建的 s。

于 2013-04-24T18:44:37.037 回答
0

我同意@matt b 的观点,即确保所有属性都可以由您在工厂本身内完成。但是,如果您确实希望 Spring 管理 Blue 和 Red Car 实例的依赖项,您可以按照以下步骤操作:

  1. 你的工厂必须实现 Spring 的 `BeanFactoryAware' 接口。从接口实现方法后,Spring 将提供对创建它的 bean 工厂的类访问。这基本上是您的应用程序上下文。

  2. 在上下文中连接您的红色和蓝色汽车。(不管它们是否与工厂在同一个文件中,只要所有 xml 都加载到上下文中)。如果您希望工厂方法的每次调用都提供一个新的完全注入的实例,请确保将红色和蓝色汽车 bean 标记为具有“原型”范围。

  3. 在您的工厂类中,实现setBeanFactory(BeanFactory beanFactory),只需保存对 bean 工厂的引用。

  4. 在您的工厂createCar方法中,一旦您决定要返回哪辆车,就从 bean 工厂中查找合适的 bean 并返回给调用者。

希望这可以帮助。

于 2013-04-24T19:53:16.930 回答