我有一个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) {
...
}
答案 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();
}
非常感谢你。这是非常优雅的解决方案