如何在Prototypes之间共享实例(Spring LoC)

时间:2013-04-16 10:49:41

标签: java spring spring-ioc

要在TaskExecutor中运行作业,我需要实例化实现Runnable接口的新作业。要解决这个问题,我会create a new Spring Prototype Bean named Job "on Demand"

但在我的申请中,Job有两个字段LocationChangerQueryTyper。这两个应该共享WebDriver创建的WebDriverFactory实例

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

UML of the Architecture

这是相关代码:

@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注入LocationChangerQueryTyper。但后来我手工操作。

@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

1 个答案:

答案 0 :(得分:2)

如果我了解您的要求,则需要在WebDriverJob之间共享LocationChanger。所以它不是prototype范围,而不是singleton范围。为了解决这个问题,我认为你要么必须按照你的建议手工完成,要么你可以尝试实现自己的范围,如Spring reference documentation

中所述。

修改

我不认为你“手工编织”解决方案看起来那么糟糕的BTW。