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

时间:2014-02-03 21:56:39

标签: java java-ee seam cdi

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

3 个答案:

答案 0 :(得分:4)

使用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中所示)。

答案 1 :(得分:3)

使用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

或者您是否在对话范围内处理某些特定内容?

答案 2 :(得分:-2)

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