首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理工厂方法返回的对象的bean依赖关系

如何处理工厂方法返回的对象的bean依赖关系
EN

Stack Overflow用户
提问于 2013-04-24 18:26:00
回答 3查看 162关注 0票数 0

我很难搞清楚这一点,我首先要提到的是班级结构:

  • CarDealer
  • CarFactory
  • 汽车(接口)
  • BlueCar (汽车的动力)
  • RedCar (汽车的动力)
  • 轮胎

CarFactory类有一个工厂方法,它返回一辆汽车。在spring.xml文件(test-spring.xml)中,bean定义如下所示:

代码语言:javascript
复制
<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,它的设置如下:

代码语言:javascript
复制
@SuppressWarnings("PMD")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-spring.xml" })
public class RedCarTest {

    @Autowired
    Car redCar;

在RedCar类中,它的属性为Tire:

代码语言:javascript
复制
public RedCar implements Car {
    @AutoWired
    private Tire tire;
}

在测试示例中,这很好,从工厂返回的redCar也是用它的依赖项轮胎初始化的。问题是当我试图在我的应用服务器上运行这个程序时。

在应用程序代码中,CarDealer类具有对Car的引用:

代码语言:javascript
复制
public CarDealer {
    private Car redCar;
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-24 18:44:37

当工厂返回一个Car ("RedCar")时,如何确保对依赖属性进行初始化。

@Autowired无法工作,因为您的工厂类正在实例化bean本身,因此Spring只能在创建bean时自动创建依赖项(并对注释进行操作)。

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

因此,实际上,工厂可以有一个SomeRedProperty字段,以便将其传递给它创建的RedCar

票数 0
EN

Stack Overflow用户

发布于 2013-04-24 18:36:41

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-24 19:53:16

我同意@matt b,确保所有的属性都可以由您自己在工厂内完成。但是,如果您确实希望Spring管理Blue和Red Car实例的依赖关系,则可以执行以下步骤:

  1. 您的工厂必须实现Spring的“`BeanFactoryAware”接口。一旦从接口实现了该方法,Spring将提供对创建它的bean工厂的类访问。这基本上是您的应用程序上下文。
  2. 连接你的红色和蓝色的汽车在上下文。(只要将所有xml加载到上下文中,它们是否与工厂位于同一个文件中并不重要)。如果您希望工厂方法的每次调用都提供一个新的完全注入实例,请确保红色和蓝色汽车bean标记为“prototype”范围。
  3. 在工厂类中,实现setBeanFactory(BeanFactory beanFactory),只需保存对bean工厂的引用。
  4. 在工厂的createCar方法中,一旦决定了要返回哪辆汽车,就从bean工厂查找适当的bean并返回给调用者。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16199490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档