要在TaskExecutor
中运行作业,我需要实例化实现Runnable
接口的新作业。要解决这个问题,我会create a new Spring Prototype Bean named Job "on Demand"。
但在我的申请中,Job
有两个字段LocationChanger
和QueryTyper
。这两个应该共享由WebDriver
创建的WebDriverFactory
实例。
现在的问题是如何用Spring设计它?
这是相关代码:
@Component
@Scope("prototype")
public class Job implements Runnable {
@Autowired
LocationChanger locationChanger;
@Autowired
QueryTyper queryTyper;
@Override
public void run() {
// at this point the locationChanger and
// queryTyper should share the same instance
}
}
@Component
@Scope("prototype")
public class LocationChanger {
@Autowired
@Qualifier(...) // For every new Job Created, the same WebDriver instance should be injected.
WebDriver webDriver
}
@Component
@Scope("prototype")
public class QueryTyper {
@Autowired
@Qualifier(...) // For every new Job Created, the same WebDriver instance should be injected.
WebDriver webDriver
}
public class WebDriverFactoryBean implements FactoryBean<WebDriver> {
@Override
public WebDriver getObject() throws Exception {
return // createdAndPrepare...
}
@Override
public boolean isSingleton() {
return false;
}
}
非常感谢!
更新1:
一种可能的解决方案是将WebDriver
自动装入作业 ,然后在@PostConstruct
中将此WebDriver注入LocationChanger
和QueryTyper
。但后来我手工操作。
@Component
@Scope("prototype")
public class Job implements Runnable {
@Autowired
LocationChanger locationChanger;
@Autowired
QueryTyper queryTyper;
@Autowired
WebDriver webDriver;
@PostConstruct
public void autowireByHand() {
locationChanger.setWebDriver(this.webDriver);
queryTyper.setWebDriver(this.webDriver);
}
}
// + remove all @Autowired WebDriver's from LocationChanger and QueryTyper
答案 0 :(得分:2)
如果我了解您的要求,则需要在WebDriver
和Job
之间共享LocationChanger
。所以它不是prototype
范围,而不是singleton
范围。为了解决这个问题,我认为你要么必须按照你的建议手工完成,要么你可以尝试实现自己的范围,如Spring reference documentation
修改强>
我不认为你“手工编织”解决方案看起来那么糟糕的BTW。