javax.inject.Singleton 和 javax.ejb.Singleton 之间的区别
我有点困惑。和 之间的确切区别是什么?javax.inject.Singleton
javax.ejb.Singleton
我有点困惑。和 之间的确切区别是什么?javax.inject.Singleton
javax.ejb.Singleton
我在这里找到了一个合理的解释:
缺省情况下,会话 Bean 是事务性的(EJB 3.1 规范的第 13.3.7 节),并且需要为每个业务方法调用获取一个独占锁(节 4.8.5.4 和 4.8.5.5)。
javax.ejb.Singleton
相比之下,a 不是事务性的,也不支持容器管理的并发(主要后果是容器没有实现锁定方案)。[...]
javax.inject.Singleton
如果你不需要 EJB 特性,请坚持使用 ( 不是由 CDI 定义的,因此它的语义不受该规范的约束)。
@ApplicationScoped
javax.inject.Singleton
为了减少将来的混淆,我使用了这个小单元测试(第一级包名称需要替换):
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import org.junit.Test;
public class SingletonTest {
/** requires com.tngtech.archunit:archunit-junit:0.4.0 */
@Test
public void detectWrongSingletonAnnotation() {
final ClassFileImporter importer = new ClassFileImporter();
final JavaClasses classes = importer.importPackages("first_level_package");
noClasses().should().beAnnotatedWith("javax.inject.Singleton")
.as("Please use javax.ejb.Singleton instead of javax.inject.Singleton.")
.check(classes);
}
}
由于接受的答案没有解决我的问题,我发布了自己的答案。它不会像Adam Bien的文章那么好,但肯定会更实用:
请考虑以下代码:
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
@Singleton
public class DatabaseConnection {
@PostConstruct
public void init() {
System.out.println("init");
}
public ChampionComp getFirstRecord() {
return new ChampionComp("Ashe", "Teemo", "Warwick",
"Blitzcrank", "Syndra", "Anivia", "Brand", "Rammus", "Xin Zhao", "Irelia");
}
}
这个 REST 服务:
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
@Path("/champions")
public class ChampionsAPI {
@Inject
private DatabaseConnection db;
@GET
@Produces("text/plain")
public String getClichedMessage() {
ChampionComp comp = db.getFirstRecord();
return comp.toString();
}
}
使用此代码工作正常。实例创建一次,然后注入到 REST 服务。但是,在导入中替换时,您将在访问db字段时收到 ChampionsAPI 类中的 NPE - 这是因为您的 Singleton 未创建(出于某种原因,也许是因为需要在使用时使用接口? )。javax.ejb.Singleton
DatabaseConnection
ejb
inject
javax.inject.Singleton