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”关联。