Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI 1.1使用后立即处置注入的资源_Java_Dependency Injection_Singleton_Cdi_Inject - Fatal编程技术网

Java CDI 1.1使用后立即处置注入的资源

Java CDI 1.1使用后立即处置注入的资源,java,dependency-injection,singleton,cdi,inject,Java,Dependency Injection,Singleton,Cdi,Inject,我有一个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 ge

我有一个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;
 }  
}
然后我创建了一个制作人类

@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;
 }
}
要运行的测试方法

 @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());
 }
运行测试程序后,我得到了这样的响应:

INFO org.jboss.weld.Bootstrap-weld-ENV-002003:weld SE容器静态\u实例已初始化
打开SR
打开SR方法
值=测试值
关闭容器
关闭SR
关闭SR方法

问题是“SimpleResource”在构造函数@Inject之前是打开的,但在构造函数退出后不是关闭的

问题是如何通过构造函数注入注入“SimpleResource”,并在构造函数退出后立即关闭

唯一能做到这一点的技术是使用@Observes方法吗

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

因为您使
SimpleResource
依赖,所以它的范围与父对象的生命周期相关联,因此它像一个单例一样被管理。要完成您所寻找的任务,您必须让构造函数直接知道bean,并可能使用创建然后销毁实例。

因为您使
SimpleResource
依赖于它,所以它的范围与父对象的生命周期相关联,因此它像单例一样被管理。要完成您想要的任务,您必须让构造函数直接知道bean,并可能使用创建然后销毁实例。

Martin Couba帮助我解决了这个问题

您可以使用@javax.enterprise.inject.transienterference。SimpleResource的producer方法是@Dependent的,因此应该在构造函数调用完成时调用disposer方法


多谢各位。这是一个非常出色的解决方案

马丁·库巴帮我解决了这个问题

您可以使用@javax.enterprise.inject.transienterference。SimpleResource的producer方法是@Dependent的,因此应该在构造函数调用完成时调用disposer方法


多谢各位。这是一个非常出色的解决方案

我正在尝试使用此技术。它使用“SimpleResource”构造函数,但我需要使用Producer方法它使用我的Produser方法创建资源,但在使用我尝试使用此技术后,我无法调用@Dispose来销毁它。它使用“SimpleResource”构造函数,但我需要使用Producer方法它使用我的Produser方法创建资源,但在使用后我无法调用@Dispose来销毁它
@Inject
public InjectConstructor(@TransientReference SimpleResource sr) {
  value = sr.getValue();
}