を使用した後、私はその後、私は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) {
...
}
私はこのteciniqueを使用しようとしています。それは "SimpleResource"コンストラクタを使用しますが、私はProducerメソッドを使う必要があります。 – vigor
私はSimpleResourceを次のように生成することができます: 'CDI.current()。select(SimpleResource.class).get();'リソースの作成にProduserメソッドを使用しますが、@Disposeを呼び出して使用後に破棄することはできません – vigor