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(汽车的植入)
- 红色汽车(汽车的进口)
- 轮胎
<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管理蓝色和红色汽车实例的依赖关系,则可以执行以下步骤:
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
在代码中的任何位置创建的对象