以编程方式将Bean注入CDI上下文?

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

无法以与实现无关的方式执行此操作。 您必须深入了解实现,找到范围对象,通过BeanManager将它们拉出来并找出如何添加它们。 并非所有这些(很可能都不是)都像地图一样容易设置。

使用CDI,您必须稍微改变您对scoped bean的看法。 在Seam2中,上下文只是在特定范围内保存的地图,您可以访问这些地图。 在CDI中,容器可以控制上下文,并且只允许在具体范围内声明bean,并且所有内容都可以在场景后面进行管理,而无需访问范围映射。 这样做是因为CDI的理念是保持事物的类型安全,只需将字符串作为值设置在映射中,并按字符串键注入它们根本不是类型安全的。

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

 @Named @ConversationScoped public class UserManager { private User currentUser; //getters and setters for currentUser } 

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

使用Producer方法不可能吗?

http://docs.jboss.org/weld/reference/1.0.0/en-US/html/producermethods.html

我这样做是为了创建注入我的bean的对象。

虽然我没有使用它,但还有BeanManager接口

http://docs.jboss.org/weld/reference/1.0.0/en-US/html/extend.html

或者您是否在会话范围内具体了解某些内容?