我正在开发一个Java EE应用程序,主要是带有JSF管理控制台的JAX-RS,它使用CDI/Weld来javax.enterprise.context.ApplicationScoped对象注入依赖项.除了一些小的调试问题,CDI已经为这个项目做了很好的工作.
现在我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制.我需要能力:
@ScopeType并实现Context我可以提供执行上述两个任务之一的方法.我完全清楚,一般来说,如果不是反对的话,CDI和依赖注入都是如此.我只是想知道
我正在尝试使用BeanManager而不是Instance .select().get()创建CDI托管bean的实例.
这被建议作为我已经使用ApplicationScoped bean和他们的家属的垃圾收集的问题的解决方法 - 请参阅CDI应用程序和依赖范围可以合谋影响垃圾收集?对于背景和建议的解决方法.
如果在ApplicationScoped bean上使用Instance编程查找方法,Instance对象和从中获取的任何bean最终都依赖于ApplicationScoped bean,因此共享它的生命周期.但是,如果使用BeanManager创建bean,则会在Bean实例本身上设置句柄,并且显然可以明确地销毁它,我理解这意味着它将被GCed.
我目前的方法是在BeanManagerUtil类中创建bean,并返回Bean,实例和CreationalContext的复合对象:
public class BeanManagerUtil {
@Inject private BeanManager beanManager;
@SuppressWarnings("unchecked")
public <T> DestructibleBeanInstance<T> getDestructibleBeanInstance(final Class<T> type,
final Annotation... qualifiers) {
DestructibleBeanInstance<T> result = null;
Bean<T> bean = (Bean<T>) beanManager.resolve(beanManager.getBeans(type, qualifiers));
if (bean != null) {
CreationalContext<T> creationalContext = beanManager.createCreationalContext(bean);
if (creationalContext != null) {
T instance = bean.create(creationalContext);
result = new DestructibleBeanInstance<T>(instance, bean, creationalContext);
}
}
return result;
}
}
public class DestructibleBeanInstance<T> {
private T instance;
private Bean<T> …Run Code Online (Sandbox Code Playgroud) 我正在使用CDI 1.0的Weld实现,我找不到如何在Spring中使用bean的方式(使用@Lazy或lazy-init在XML中).有没有办法告诉CDI Injector不要在启动时初始化bean?
使用 WildFly 18.0.1 创建多个 @Dependent 实例来测试内存泄漏
@Dependent
public class Book {
@Inject
protected GlobalService globalService;
protected byte[] data;
protected String id;
public Book() {
}
public Book(GlobalService globalService) {
this.globalService = globalService;
init();
}
@PostConstruct
public void init() {
this.data = new byte[1024];
Arrays.fill(data, (byte) 7);
this.id = globalService.getId();
}
}
@ApplicationScoped
public class GlobalFactory {
@Inject
protected GlobalService globalService;
@Inject
private Instance<Book> bookInstance;
public Book createBook() {
return bookInstance.get();
}
public Book createBook2() {
Book b = bookInstance.get()
bookInstance.destroy(b); …Run Code Online (Sandbox Code Playgroud) cdi ×4
java ×2
jboss-weld ×2
ejb ×1
jakarta-ee ×1
java-ee ×1
managed-bean ×1
memory-leaks ×1
spring ×1
weld ×1