2016-04-18 13 views
0

を使用した後、私はその後、私はCDI 1.1処分は

@Singleton 
public class EntityManagerProducer { 

@Produces 
@Default 
@Dependent 
public static SimpleResource createSimpleResource() { 
    SimpleResource sr = new SimpleResource(); 
    System.out.println("Open SR"); 
    sr.open(); 
    return sr; 
} 

public static void disposeSimpleResource(@Disposes @Default SimpleResource simpleResource) { 
    System.out.println("Close SR"); 
    simpleResource.close(); 
    } 
} 

そしてシングルトンビジネスクラスよりも

@Default 
@Singleton 
public class InjectConstructor { 
private String value="init"; 

@Inject 
public InjectConstructor(SimpleResource sr){ 
    value=sr.getValue(); 
} 

public String getValue() { 
    return value; 
} 
} 
プロデューサークラスを作成しましたSimpleResourceクラスに

@Vetoed 
public class SimpleResource { 
    private String value="TestValue"; 
    public void open(){ 
    System.out.println("Open SR method"); 
} 
public void close(){ 
    System.out.println("Close SR method"); 
} 
public String getValue() { 
    return value; 
} 
} 

を持つ即時資源を注入し

実行するテスト方法

溶接SEコンテナSTATIC_INSTANCEが
オープンSR
オープンSR法
を初期化: - WELD-ENV-002003

INFO org.jboss.weld.Bootstrap:

@Test 
public void injectConstructor(){ 
    Weld weld = new Weld(); 
    WeldContainer container = weld.initialize(); 
    InjectConstructor inst= container.select(InjectConstructor.class).get(); 
    System.out.println("Value= "+inst.getValue()); 
} 

テストプログラムを走った後、私はそのような応答を持っています 値=でtestValue
閉じるコンテナ
閉じるSR
閉じるSR法

問題は、 "SimpleResource"がコンストラクタ@Injectの前にopendされていて、コンストラクタが終了した後に閉じるのではないということです。

質問は "SimpleResource"をコンストラクタインジェクションで注入し、コンストラクタを終了した直後に閉じたのですか?

これを行うための唯一のテクニックは@Observesメソッドを使用していますか?

public void watchStartup(@Observes @Initialized(ApplicationScoped.class) Object ctxEvent, SimpleResource sr) { 
... 
} 

答えて

0

Martin Coubaはこの問題を解決するのに役立ちました。

@ javax.enterprise.inject.TransientReferenceを使用できます。 SimpleResourceのプロデューサメソッドは@Dependentなので、コンポーザの呼び出しが完了したときにディスポーザメソッドを呼び出す必要があります。

@Inject 
public InjectConstructor(@TransientReference SimpleResource sr) { 
    value = sr.getValue(); 
} 

ありがとうございました。それは非常にエリートな解決策です

0

あなたはSimpleResource依存作っているので、結果はそのシングルトンのように管理として、その範囲は、親のライフサイクルに関連付けられています。あなたが探していることをするには、コンストラクタにBeanを直接認識させ、おそらくUnmanagedを使用してインスタンスを作成し、インスタンスを破棄する必要があります。

+0

私はこのteciniqueを使用しようとしています。それは "SimpleResource"コンストラクタを使用しますが、私はProducerメソッドを使う必要があります。 – vigor

+0

私はSimpleResourceを次のように生成することができます: 'CDI.current()。select(SimpleResource.class).get();'リソースの作成にProduserメソッドを使用しますが、@Disposeを呼び出して使用後に破棄することはできません – vigor