CDI 1.1使用

时间:2016-04-18 09:58:30

标签: 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 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:焊接SE容器STATIC_INSTANCE已初始化
打开SR
打开SR方法
值= TestValue
关闭集装箱
关闭SR
关闭SR方法

问题在于" SimpleResource"在构造函数@Inject之前打开,但在构造函数退出后没有关闭。

问题是如何注入" SimpleResource"通过构造函数注入并关闭构造函数退出后的立即?

唯一的tecnique是否使用@Observes方法?

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

2 个答案:

答案 0 :(得分:0)

因为你使SimpleResource依赖,所以它的范围与父级的生命周期有关,因此它的管理方式就像一个单例。要做你正在寻找的东西,你必须让构造函数直接知道bean,并且可能使用Unmanaged来创建然后销毁一个实例。

答案 1 :(得分:0)

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

  

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

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

非常感谢你。这是非常优雅的解决方案