javaee中的无状态单例
我想在JAVA-EE中定义一个“无状态单例”,它可以被多个线程同时访问 我所说的无状态是指:Bean实例没有字段 我应该使用哪一个: 第1版:javaee中的无状态单例,java,jakarta-ee,Java,Jakarta Ee,我想在JAVA-EE中定义一个“无状态单例”,它可以被多个线程同时访问 我所说的无状态是指:Bean实例没有字段 我应该使用哪一个: 第1版: @javax.ejb.Singleton @ConcurrencyManagement(ConcurrencyManagementType.BEAN) public class MyStatelessSingleton { .. } 第2版: @ApplicationScoped public class MyStatelessSingleton {
@javax.ejb.Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class MyStatelessSingleton {
..
}
第2版:
@ApplicationScoped
public class MyStatelessSingleton {
..
}
第3版:
@javax.inject.Singleton
public class MyStatelessSingleton {
..
}
顺便说一句,我看不到将“无状态实例”集合起来而不是一个“无状态单例bean”的好处。我认为这并不重要。这是单身汉。它的无状态/全状态性质将只取决于您如何实现它
ApplicationScoped
是我在这里的最爱。我认为重要的是,@ApplicationScoped'由servlet容器管理,而@javax.ejb.Singleton由ejb容器管理。如果客户端没有web会话并且只在ejb容器中使用“MyStatelessSingleton”,这有关系吗?使用适合您的一个。无状态的意思是,您的Bean实例没有字段?否则,如果使用带字段的无状态bean,则池化无状态实例(@stateless)可以帮助您与没有并发管理的单例实例进行比较。在对bean的一次调用期间,您可以安全地使用实例的字段,因为在该调用期间,实例属于您的线程。如果bean实例使用对同一bean中其他方法的调用,这有助于避免参数的长列表。这可能不是一个很好的解决方案,但它确实发生了。对于停用并发管理的Singleton,这些字段有被其他线程操作的危险。但是你也可以在这样的单例中使用字段,如果你定义它们ThreadLocal或者用Atomic处理它们……是的,我也倾向于使用'@ApplicationScoped'。我找不到使用“版本1”的任何好处。顺便说一下,我想对无状态DAO使用“无状态单例”模式(典型的JPA-CRUD,其中entityManager在方法参数中提供)。所以我想,无状态单例比使用“@stateless”要好。但是如果bean是无状态的,那么只有当您使用非单例bean时,statefull才起作用,因为容器可能在单个进程中处理实例,因为它是否是该bean的同一个实例并不重要。单身汉总是一样的。此外,全豆有其生命周期。很难说单例中有生命周期。我只是决定使用“单例”而不是“无状态”来节省内存:因为我不想在每次注入时注入新的(无状态)实例或从一堆池实例中注入。我不需要有状态bean,也不需要池实例。我看不到将“无状态实例”集合起来而不是一个“无状态单例bean”的好处