java - 以编程方式将 Bean 注入(inject) CDI 上下文?

标签 java jakarta-ee seam cdi

是否可以手动将 bean 注入(inject)到 CDI 上下文中?使用 JBoss Seam 框架,我总是可以执行类似 Contexts.getConversationContext().set("foo", bar); 这样的操作,Bean 将成为该上下文的一部分。是否可以在 Java EE 6 CDI 中执行类似的操作?

最佳答案

使用 CDI,您必须稍微改变您对作用域 bean 的看法。在 Seam2 中,上下文只是保存在特定范围内的 map ,您可以访问这些 map 。在 CDI 中,容器获得了对上下文的控制权,并且只允许您在具体范围内声明 bean,并且所有内容都在后台进行管理,而无需访问范围映射。这样做是因为 CDI 的哲学是保持事物类型安全,而只是将事物设置为一个字符串作为值并通过它们的字符串键注入(inject)它们根本不是类型安全的。

要实现您想要的目标,请在具体范围内创建一个“holder”bean 并将您的值保存在那里。

@Named
@ConversationScoped
public class UserManager {

  private User currentUser;

  //getters and setters for currentUser

}

在此示例中,通过将 User 实例设置在对话作用域的 bean 中,将其保存在对话作用域中。这是完全类型安全的,因为您可以通过使用 @Inject(实际上使用的是 bean 类型)将 UserManager 注入(inject)任何您想要的地方,避免在进行重构时不安全的字符串键(如在 Seam2 中)。

关于java - 以编程方式将 Bean 注入(inject) CDI 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538679/

相关文章:

java - Spring - @RequestBody 阻止请求?

java - Java中的JSON解析找不到项目

java - 在 google appengine 部署 war 文件后从内部检查 war 文件

java - CPU 核心在确定 JVM 堆大小方面的作用是什么?

java - JFree Barchart DefaultCategoryDataset 值被替换

java - JPA 查询失败然后连接丢失

jsf - 使用a4j :repeat or ui:repeat inside rich:dataTable doesn't render radio buttons properly

具有网络用户配置文件的 Windows 7 上的 Java 属性 "user.home"

java - 第三方缓存软件——它们提供什么?

java - SEAM FacesMessage 未显示