接缝双射和焊接

时间:2011-04-03 21:28:29

标签: java-ee seam cdi

我正在开发一个JAVA EE 6应用程序。我正在广泛使用CDI,我的问题是@Inject和@Produces是否与@In和@Out一样用于Seam?现在我们还有@In和@Out注释,我们有CDI吗?

1 个答案:

答案 0 :(得分:11)

  

@In和@Out注释是否仍然存在   现在我们用CDI了吗?

@In@Out是Seam 2注释,因此它们不在Java EE 6中使用。

  

我的问题是@Inject和   @Produces与@In和@Out相同   接缝?

@Inject@Produces 完全相同,但它们大致相同。主要区别在于,当需要(由需要依赖性的组件控制)时会生成Java EE 6依赖项,而在Seam 2中,只要某些内容准备好使用就会执行注入其他地方(由提供依赖关系的组件控制)

以登录为例:

  • 在Seam 2中,经过身份验证的用户在成功登录后立即被注入所需范围(如会话)。登录组件本身的范围通常适合用例(对话),但不是提供的依赖(会话)的范围。
  • 在Java EE 6中,会话范围的登录组件执行身份验证并将经过身份验证的用户存储在私有字段中。然后,该字段由生产者方法控制。因此,每当另一个组件请求经过身份验证的用户时,就会执行以下操作:

      @Produces @LoggedIn User getCurrentUser() {
          return user;
       }
    

为什么?我听你问......

原因很简单。 Weld / Java EE 6能够代理(大多数)依赖项,从而获得巨大的性能提升。并且根本不可能代理注射: - )

嗯,除此之外:Java EE 6以需求为导向的方法(在需要时请求它)感觉优于Seam 2(生成并存储它)。