3

假设我有一个类,它只生成一些 bean、列表、项目等,比如

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单例对此有好处,但我真的不知道为什么。

4

3 回答 3

10

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

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

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

于 2016-03-08T10:03:35.147 回答
2

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

于 2013-10-21T18:33:30.977 回答
0

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

于 2013-10-18T07:42:56.853 回答