使用新的 EJB 3.1 规范是否可以将 EJB 注入到 pojo 中?我知道在 EJB 3.0 中,@EJB 注释可用于注入 EJB,但这不适用于简单的 pojo。
如果不是,我必须在 JNDI 中查找 bean,因为我知道您不能简单地使用 new 关键字。
使用新的 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,则必须进行查找。
是的,使用 JNDI 查找。
由于您的 POJO 是由您创建的(我假设),因此容器不负责注入依赖项。
新的 EJB 规范 (3.1) 增加了为 EJB 指定全局 JNDI 名称的能力。这意味着您可以在任何地方的任何 bean 中使用它们。
但是,您必须进行显式 JNDI 查找,因为 EJB 3.1 容器不会知道您的 POJO。
唯一的例外,我猜这不适用于您,如果您的 POJO 确实是应用程序客户端,在这种情况下,如果包含 EJB 的字段是静态的,您可以对其应用 @EJB 注释。如果这是您的情况,您应该查看整个 Java EE 5 规范中的应用程序客户端规则。
最后,包含 JSR-299 的 Java EE 6 可能允许您所描述的事情以某种方式发生;我不知道规范,所以不能评论它。
我希望这一切都有帮助。
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.