13

使用新的 EJB 3.1 规范是否可以将 EJB 注入到 pojo 中?我知道在 EJB 3.0 中,@EJB 注释可用于注入 EJB,但这不适用于简单的 pojo。

如果不是,我必须在 JNDI 中查找 bean,因为我知道您不能简单地使用 new 关键字。

4

4 回答 4

29

使用新的 EJB 3.1 规范是否可以将 EJB 注入到 pojo 中?我知道在 EJB 3.0 中,@EJB 注释可用于注入 EJB,但这不适用于简单的 pojo。

如果您使用 JSR-299(Java上下文和依赖注入),即如果您的POJO是 CDI 托管 bean,则可以将 EJB 注入 POJO 。在这种情况下,您可以这样做:

@Inject MyEJB service

但这不是 EJB 3.1 的特性,它来自 CDI。如果您不使用 CDI,则必须进行查找。

于 2010-08-14T14:23:44.417 回答
19

是的,使用 JNDI 查找。

由于您的 POJO 是由您创建的(我假设),因此容器不负责注入依赖项。

于 2010-01-07T16:22:35.227 回答
7

新的 EJB 规范 (3.1) 增加了为 EJB 指定全局 JNDI 名称的能力。这意味着您可以在任何地方的任何 bean 中使用它们。

但是,您必须进行显式 JNDI 查找,因为 EJB 3.1 容器不会知道您的 POJO。

唯一的例外,我猜这不适用于您,如果您的 POJO 确实是应用程序客户端,在这种情况下,如果包含 EJB 的字段是静态的,您可以对其应用 @EJB 注释。如果这是您的情况,您应该查看整个 Java EE 5 规范中的应用程序客户端规则。

最后,包含 JSR-299 的 Java EE 6 可能允许您所描述的事情以某种方式发生;我不知道规范,所以不能评论它。

我希望这一切都有帮助。

于 2010-01-07T18:19:36.130 回答
1

I wonder too if I could inject EJBs into unmanaged objects. See the Weld (JSR 299 reference implementation) documentation for more details.

But you can perform dependency injection by hand inside a repository or factory like this:

@Stateless
public PojoRespository {

  @Inject
  ResourceForPojos resource;
  @PersistenceContext
  private EntityManager em;

  public Pojo findById(Object id) {
    Pojo p = (Pojo) em.find(Pojo.class, id);
    p.setResource(resource); // injects resource
    return p;
  }

}

If you have many methods where injection should be performed, you could use an interceptor.

于 2010-01-08T13:43:57.657 回答