Luc*_*rum 2 java cdi jboss-weld weld weld2
使用有什么区别:
WeldContainer se = new Weld().initialize();
或者
SeContainer se = SeContainerInitializer.newInstance().initialize();
我只是想使用@Injection和@Produce注解,但是我还没有发现这两种初始化对象实例的方式之间的区别。
上下文和依赖注入(CDI) 是一种规范。这意味着它只定义了一个 API,不提供实现。这就是为什么您必须包含诸如Weld 之类的实现才能实际使用 API。的WeldContainer类是供应商特定的,而SeContainer接口是说明书的一部分。前者实现后者。
该SeContainerInitializer班,这是API的一部分,将委托给包括在申请执行。因此,如果您使用Weld作为实现,那么最终使用SeContainerInitializer和SeContainer与使用Weld和WeldContainer“在幕后”相同。
从纯粹主义者的角度来看,最好只依赖规范的接口,而不要直接依赖于实现。这样您就可以在需要时更换供应商,因为您使用的是所有实现通用的功能。但是,通常实现提供的功能比规范要求的要多。为了使用该功能,您必须直接依赖于实现。
换句话说,是使用Weld/WeldContainer还是SeContainerInitialializer/SeContainer取决于应用程序的(当前和未来)需求。如有疑问,请编程到界面。
请注意,API 和实现之间的这种分离并不是 CDI 独有的。几乎整个Java EE——或者现在众所周知的Jakarta EE—— API 都是这样工作的。一个例子是Java Persistence API (JPA) 和Hibernate或EclipseLink(两种实现)。例如,Java SE 中有Java 数据库连接(JDBC) API 和各种实现(即驱动程序)。