WeldContainer 和 SeContainer

Luc*_*rum 2 java cdi jboss-weld weld weld2

使用有什么区别:

WeldContainer se = new Weld().initialize();

或者

SeContainer se = SeContainerInitializer.newInstance().initialize();

我只是想使用@Injection@Produce注解,但是我还没有发现这两种初始化对象实例的方式之间的区别。

Sla*_*law 6

上下文和依赖注入(CDI) 是一种规范。这意味着它只定义了一个 API,不提供实现。这就是为什么您必须包含诸如Weld 之类的实现才能实际使用 API。的WeldContainer类是供应商特定的,而SeContainer接口是说明书的一部分。前者实现后者。

SeContainerInitializer班,这是API的一部分,将委托给包括在申请执行。因此,如果您使用Weld作为实现,那么最终使用SeContainerInitializerSeContainer与使用WeldWeldContainer“在幕后”相同。

从纯粹主义者的角度来看,最好只依赖规范的接口,而不要直接依赖于实现。这样您就可以在需要时更换供应商,因为您使用的是所有实现通用的功能。但是,通常实现提供的功能比规范要求的要多。为了使用该功能,您必须直接依赖于实现。

换句话说,是使用Weld/WeldContainer还是SeContainerInitialializer/SeContainer取决于应用程序的(当前和未来)需求。如有疑问,请编程到界面

请注意,API 和实现之间的这种分离并不是 CDI 独有的。几乎整个Java EE——或者现在众所周知的Jakarta EE—— API 都是这样工作的。一个例子是Java Persistence API (JPA) 和HibernateEclipseLink(两种实现)。例如,Java SE 中Java 数据库连接(JDBC) API 和各种实现(即驱动程序)。