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 如何在原型之间共享实例(Spring LoC)_Java_Spring_Spring Ioc - Fatal编程技术网

Java 如何在原型之间共享实例(Spring LoC)

Java 如何在原型之间共享实例(Spring LoC),java,spring,spring-ioc,Java,Spring,Spring Ioc,要在TaskExecutor中运行作业,我需要实例化实现Runnable接口的新作业。为了解决这个问题,我会的 但是在我的应用程序中,Job有两个字段LocationChanger和QueryTyper。这两个应用程序应该共享由WebDriverFactory创建的相同WebDriver实例 现在的问题是如何用弹簧来设计它 这是相关代码: @组件 @范围(“原型”) 公共类作业实现可运行{ @自动连线 位置变换器位置变换器; @自动连线 查询类型查询类型; @凌驾 公开募捐{ //此时,位置变

要在
TaskExecutor
中运行作业,我需要实例化实现
Runnable
接口的新作业。为了解决这个问题,我会的

但是在我的应用程序中,
Job
有两个字段
LocationChanger
QueryTyper
。这两个应用程序应该共享由
WebDriverFactory
创建的相同
WebDriver
实例

现在的问题是如何用弹簧来设计它

这是相关代码:

@组件
@范围(“原型”)
公共类作业实现可运行{
@自动连线
位置变换器位置变换器;
@自动连线
查询类型查询类型;
@凌驾
公开募捐{
//此时,位置变换器和
//queryTyper应该共享同一个实例
}
}
@组成部分
@范围(“原型”)
公共类位置变换器{
@自动连线
@限定符(…)//对于创建的每个新作业,都应该注入相同的WebDriver实例。
网络驱动程序
}
@组成部分
@范围(“原型”)
公共类查询类型器{
@自动连线
@限定符(…)//对于创建的每个新作业,都应该注入相同的WebDriver实例。
网络驱动程序
}
公共类WebDriverFactoryBean实现FactoryBean{
@凌驾
公共WebDriver getObject()引发异常{
返回//创建并准备。。。
}
@凌驾
公共布尔isSingleton(){
返回false;
}
}
非常感谢

更新1: 一种可能的解决方案是,仅在作业中自动连接
WebDriver
,然后在
@PostConstruct
中将此WebDriver注入
位置更改程序
查询类型
。但后来我用手接线

@组件
@范围(“原型”)
公共类作业实现可运行{
@自动连线
位置变换器位置变换器;
@自动连线
查询类型查询类型;
@自动连线
网络驱动程序;
@施工后
public void autowireByHand(){
locationChanger.setWebDriver(this.webDriver);
queryTyper.setWebDriver(this.webDriver);
}
}
//+从位置变换器和查询类型器中移除所有@Autowired WebDriver's

如果我了解您的要求,您需要
WebDriver
Job
LocationChanger
之间共享。所以它不是
prototype
范围,也不是
singleton
范围。要解决这个问题,我认为您要么必须按照您的建议手工完成,要么可以尝试实现您自己的范围,如中所述

编辑


顺便说一句,我不认为你的“手工”解决方案看起来那么糟糕。

所以你想让
WebDriver
成为单身汉?不,每次如果
Job
被实例化,这个
Job
和它的孩子应该共享相同的
WebDriver
。所以它不是单例:(感谢自定义范围的想法。也许就是这样。我考虑了动态限定符。例如:
LocationChanger
QueryTyper
应该这样标记Webdriver:
@Autowire@Qualifier(以某种方式将此字符串与创建的作业实例关联起来)webDriver
注释。应该可以使用自定义范围。您只需找出实例的存储位置以便检索,然后将它们与“对话id”关联。