您在 CDI 中使用生产者方法的类使用什么范围



假设我有一个类,它只生成一些豆子、列表、项目等

public class MightyProducer {
    @Produces
    public Bean1 someBean() {
         //some init
         return new Bean1();
    }
    @Produces
    @CoolItems
    public List<Items> items() {
        //some init
        return new ArrayList<Item>();
    }
}

像这样的类的范围应该是什么?我应该把它留给@Dependent还是有任何最佳实践?我在某处读到CDI辛格尔顿对此有好处,但我真的不知道为什么。

这个线程是我能找到的唯一一个关于这个主题的线程。由于我没有找到完全令人满意的答案,我做了一个小实验,我曾经声明过包含带有@ApplicationScoped注释的@Produces方法的类,一次没有它。我在私有构造函数中跟踪了我的生产者类实例的构造。

我发现在生产者类用@ApplicationScoped注释的情况下,只创建了一个实例,这是相当明显的。但是,如果没有注释,每当调用 @Produces 方法时,都会创建一个新实例,因为正在创建注入了生成类型的 Bean 实例。

因此,使生产者类@ApplicationScoped以减少(不必要的)对象创建可能有点意义。但是由于现在对象创建被认为非常便宜,这可能只有在生产者类至少有一些状态要初始化时才有意义。

包含生产者的类的范围实际上并不重要,但是,正在生成的项目的范围很重要。如果生产者字段/方法上没有范围注释,那么它将在包含类的范围内生成该对象。

由于此类是无状态的(不将值存储在成员变量中),并且不依赖于作用域实例,因此可以安全地使用单一实例。

最新更新