是否可以手动将 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/