假设我有一个类,它只生成一些豆子、列表、项目等
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
以减少(不必要的)对象创建可能有点意义。但是由于现在对象创建被认为非常便宜,这可能只有在生产者类至少有一些状态要初始化时才有意义。
包含生产者的类的范围实际上并不重要,但是,正在生成的项目的范围很重要。如果生产者字段/方法上没有范围注释,那么它将在包含类的范围内生成该对象。
由于此类是无状态的(不将值存储在成员变量中),并且不依赖于作用域实例,因此可以安全地使用单一实例。