相关疑难解决方法(0)

是否有可能破坏CDI范围?

我正在开发一个Java EE应用程序,主要是带有JSF管理控制台的JAX-RS,它使用CDI/Weld来javax.enterprise.context.ApplicationScoped对象注入依赖项.除了一些小的调试问题,CDI已经为这个项目做了很好的工作.

现在我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制.我需要能力:

  • 从应用程序上下文中删除注入的对象,或
  • 销毁/删除/清除/重置/删除整个应用程序上下文,或
  • 定义我自己的@ScopeType并实现Context我可以提供执行上述两个任务之一的方法.

我完全清楚,一般来说,如果不是反对的话,CDI和依赖注入都是如此.我只是想知道

  • 这远程可能吗?
  • 如果是,那么完成工作最简单/最简单/最快/最愚蠢的方法是什么?

java java-ee cdi jboss-weld

9
推荐指数
2
解决办法
4283
查看次数

如何通过BeanManager创建和销毁CDI(Weld)托管Bean?

我正在尝试使用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)

java garbage-collection cdi managed-bean jboss-weld

7
推荐指数
1
解决办法
1万
查看次数

如何使CDI bean懒洋洋地初始化?

我正在使用CDI 1.0的Weld实现,我找不到如何在Spring中使用bean的方式(使用@Lazylazy-init在XML中).有没有办法告诉CDI Injector不要在启动时初始化bean?

spring cdi lazy-initialization

6
推荐指数
3
解决办法
3165
查看次数

将@Dependent CDI bean 注入 EJB 导致内存泄漏

使用 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)

memory-leaks ejb cdi weld jakarta-ee

5
推荐指数
1
解决办法
451
查看次数