4

要在其中运行作业,TaskExecutor我需要实例化实现Runnable接口的新作业。为了解决这个问题,我将创建一个名为 Job "on Demand" 的新 Spring Prototype Bean

但是在我的应用程序中 aJob有两个字段LocationChangerQueryTyper. 这两个应该共享由 a 创建的同一个WebDriver实例WebDriverFactory

现在的问题是如何用 Spring 设计这个?

架构的 UML

这是相关代码:

@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在 Job中自动装配,然后将此 WebDriver 注入到and中。但后来我用手接线。@PostConstructLocationChangerQueryTyper

@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
4

1 回答 1

2

如果我理解您的要求,您需要WebDriver在 aJobLocationChanger. 所以它不是prototype范围,也不是singleton范围。为了解决这个问题,我认为您要么必须按照您的建议手动完成,要么您可以尝试实现自己的范围,如Spring 参考文档中所述

编辑

顺便说一句,我认为您的“手动接线”解决方案看起来并不那么糟糕。

于 2013-04-16T10:59:20.483 回答