Spring Dependency Injection对象池

时间:2017-06-06 05:37:26

标签: java spring dependency-injection

我们有一个Object在spring引导容器中进行一些计算。让我们称之为“工作表”。我们需要在应用程序启动时实例化 - 比方说10张。每次我们开始计算时,我们都需要通过DI访问该表的一个实例,以便在额外的线程中运行。

有任何想法是否可以在Spring中使用?

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式实现此目的。假设您有一个Sheet类,如下所示。我使用 java8 来编译代码。

Sheet.java

 @Component("sheet")
    @Scope(value = "prototype")
    public class Sheet {
        // Implementation goes here
    }

现在您需要第二个班级SheetPool,其中包含10个Sheet

个实例

<强> SheetPool.java

public class SheetPool {

    private List<Sheet> sheets;

    public List<Sheet> getSheets() {
        return sheets;
    }

    public Sheet getObject() {
        int index = ThreadLocalRandom.current().nextInt(sheets.size());
        return sheets.get(index);
    }

}

请注意SheetPool不是Spring组件。它只是一个简单的java类。

现在你需要一个第三个类,它是一个配置类,它将负责用SpringPool的10个实例创建Sheet个对象

<强> ApplicationConfig.java

@Configuration
public class ApplicationConfig {

@Autowired
ApplicationContext applicationContext;

@Bean
public SheetPool sheetPool() {
    SheetPool pool = new SheetPool();

    IntStream.range(0, 10).forEach(e -> {
        pool.getSheets().add((Sheet) applicationContext.getBean("sheet"));
    });

    return pool;
}

}

现在,当应用程序启动SheetPool时,将使用10个不同的Sheet实例创建对象。要访问Sheet对象,请使用以下代码。

@Autowired
SheetPool  sheetPool;

Sheet sheetObj = sheetPool.getObject();