Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理工厂方法返回的对象的bean依赖关系_Java_Spring - Fatal编程技术网

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

Java 如何处理工厂方法返回的对象的bean依赖关系,java,spring,Java,Spring,我很难弄明白这一点,我首先要提到班级结构: 卡德勒 汽车制造厂 车辆(接口) BlueCar(汽车的植入) 红色汽车(汽车的进口) 轮胎 CarFactory类有一个返回Car的工厂方法。在SpringXML文件(test Spring.XML)中,bean定义如下所示: <bean id="carDealer" class="...CarDealer> <property name="car" ref="car"/> </bean> <be

我很难弄明白这一点,我首先要提到班级结构:

  • 卡德勒
  • 汽车制造厂
  • 车辆(接口)
  • BlueCar(汽车的植入)
  • 红色汽车(汽车的进口)
  • 轮胎
CarFactory类有一个返回Car的工厂方法。在SpringXML文件(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" />
@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也用它的依赖项轮胎初始化。问题是当我试图从我的应用程序服务器上运行它时

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

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

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

当工厂返回汽车(“RedCar”)时,我如何确保从属属性已初始化

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

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


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

我同意@matt b的观点,即确保所有属性都可以由您在工厂内设置。但是,如果您确实希望Spring管理蓝色和红色汽车实例的依赖关系,则可以执行以下步骤:

  • 您的工厂必须实现Spring的“BeanFactoryAware”接口。一旦从接口实现了该方法,Spring将提供对创建它的bean工厂的类访问。这基本上就是您的应用程序上下文

  • 把你的红蓝相间的车连接起来。(只要所有XML都加载到上下文中,它们是否与工厂位于同一文件中并不重要)。如果希望工厂方法的每次调用都提供一个新的完全注入实例,请确保红色和蓝色的carbean被标记为具有“prototype”的范围

  • 在工厂类中,实现
    setBeanFactory(BeanFactory BeanFactory)
    ,只需保存对bean工厂的引用

  • 在工厂的
    createCar
    方法中,一旦决定要返回哪辆车,从bean工厂中查找适当的bean并返回给调用者


  • 希望这能有所帮助。

    在您评论中的示例中,您要求spring自动关联属性。。RedCarTest的实例由Spring(@RunWith)创建,要注入的实例也由Spring创建。所以注入是可能的。在实际应用程序中(JEE-app,web.xml中定义的spring上下文),它也在spring下。例如,我有另一个Springbean(我们称之为CarDealer),它有一个属性Car(从上面映射到Bean id='Car',在本例中,它是从工厂调用返回的redCar),它具有依赖性someRedProperty(也是一个Bean)。这似乎是可行的,因为它们都“应该”是春天的一部分。我不明白为什么在测试代码中它可以工作,但在实际应用程序中却不能。你现在是在谈论一个不同的问题吗?也许你应该开始另一个问题,并在那里发布相关代码。这是同一个问题,只是从原来的帖子扩展而来,我不在这里发布太多,所以我不想在这里放太多的细节,但也许我会编辑这个问题,使它更清楚。谢谢,我已经扩展了这个问题,希望问题更清楚。为什么要使用方面来丰富工厂返回的对象?这一方面可能只适用于那一家工厂,使它有点混乱。Aspects应该用于向多个类添加功能,这就是我的意思,Aspects@Autowired可以在所有对象中工作,即使是使用
    new
    在代码中的任何位置创建的对象