Java CDI 1.1使用后立即处置注入的资源
我有一个SimpleResource类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
@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();
}