2017-06-06 12 views
0

スプリングブートコンテナで計算を行うオブジェクトがあります。それを「シート」と呼ぶことができます。アプリケーションの起動時に、10枚のシートをインスタンス化する必要があります。計算を開始するたびに、余分なスレッドで実行されるDIを介してアクセスされるシートのインスタンスが1つ必要です。スプリング依存性注入オブジェクトプール

これはSpringで可能かどうかを考えていますか?

+0

通常のプールを使用できませんか? https://commons.apache.org/proper/commons-pool/のように? –

+1

カスタムスプリングBeanを作成するhttps://stackoverflow.com/a/15773000/6743203 –

答えて

1

これは次のようにして実現できます。Sheetクラスがあるとしましょう。私はjava8を使ってコードをコンパイルしました。

Sheet.java

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

今、あなたはSheetPoolではないことに注意

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.javaSheet

の10個のインスタンスを保持する第2クラスSheetPoolが必要Springコンポーネントこれは単なる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; 
} 

ApplicationConfig.java}

Sheet

の10インスタンスとSpringPoolオブジェクトを作成するの世話をする設定クラスは、第三のクラスが必要アプリケーションが起動すると、SheetPoolオブジェクトは、シートの10の異なるインスタンスで作成されます。Sheetオブジェクトにアクセスするには次のコードを使用します。

@Autowired 
SheetPool sheetPool; 

Sheet sheetObj = sheetPool.getObject();