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

时间:2013-10-17 13:07:19

标签: java java-ee cdi

假设我有一个类只生成一些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单身人士对此有好处但我真的不喜欢不知道为什么。

3 个答案:

答案 0 :(得分:7)

这个帖子是我在这个主题上唯一能找到的。由于我没有找到完全令人满意的答案,我进行了一个小实验,在那里我曾经宣布该类包含一个带有<tr ng-repeat="foot in countries | orderBy:orderByField:reverse | filter:search" country="country"> 注释的@Produces方法,一次没有它。我在私有构造函数中跟踪了我的生成器类的实例的构造。

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

因此,在使生成器类@Produces减少(不必要)对象创建时可能会有一点意义。但是,由于现在假设对象创建如此便宜,如果生产者类至少有一些状态要初始化,那么这可能只是相关的。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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