访问EJB中的注入资源

时间:2013-11-10 10:23:49

标签: java-ee resources ejb

我正在阅读resource injection in the java-ee tutorial一章,我无法理解在注入资源后使用资源的方式,或者换句话说,人们可以以何种方式访问​​资源:

基于字段的注入:

public class SomeClass {
    @Resource(name="customerDB")
    private javax.sql.DataSource myDB;
...
}

基于方法的注入:

public class SomeClass {

    private javax.sql.DataSource myDB;
...
    @Resource(name="customerDB")
    private void setMyDB(javax.sql.DataSource ds) {
        myDB = ds;
    }
...
}

基于类注入:

@Resource(name="myMessageQueue",
                type="javax.jms.ConnectionFactory")
public class SomeMessageBean {
...
}

我想在class-based中只能使用lookup(究竟是怎样?)。但是,在前两种情况下,应该如何使用资源,特别是在使用名称另外定义时?

更新:

如果不完全清楚,我的问题涉及以下主题:

1)在field-method-based injection中我是否可以访问资源,如:

myDB.someMethod();

customerDB.someMethod();

如果第一个是正确的,那么name的目的是什么?我可以使用lookup访问它吗?

2)我如何在class-based injection中访问它?我想lookup但是在哪条路上?

2 个答案:

答案 0 :(得分:4)

  

如果第一个是对的,这个名字的目的是什么?我可以通过查找来访问它吗?

JNDI和大量重载@Resource注释中的困难和主要原因是name指的是与组件关联的本地ENC空间(如果是EJB bean) ,这是单一的Bean)。您可以使用java:comp/env从初始上下文访问此空间。

'name'既是TARGET名称又是SOURCE名称。作为目标名称,它不会查找内容,而是在ENC中存储内容。如果某些内容已经映射到ENC中,例如通过XML,然后它作为源名称(它用于从ENC查找)。

然而,

'lookup'总是做它所说的;它在“GLOBAL”JNDI命名空间中进行查找,例如java:app/java:module/等。请注意,我将全局放在引号之间,因为即使这些名称空间仍然相对于完成JNDI查找的位置。

  

我如何在基于类的注射中访问它?

基于类的注入是用于将某些内容映射到组件的ENC的XML语法的注释。它不是恕我直言,很好地转化为现代编程实践。在向ENC中注入一些内容后,您可以使用前面提到的InitialContext空间通过java:comp/env再次查找。

E.g。给定

@Resource(name="myMessageQueue",
                type="javax.jms.ConnectionFactory")
public class SomeMessageBean {
...
}

您可以从方法的调用链中的任何位置向SomeMessageBean执行以下查找,UP TILL下一次调用Java EE组件(设置新的ENC上下文):

try {
    ConnectionFactory connectionFactory = new InitialContext().lookup("myMessageQueue");
} catch (NamingException e) {
   ...
}

总而言之@Resource是尝试在Java EE中将古老的前置光盘有点现代化,但由于遗留问题,它本身增加了大量的复杂性。恕我直言,如果整个Java EE将迁移到@Inject会更好,它具有更清晰和更少重载的语义。

另请参阅:Declaring @Resource and @EJB at the class level in Java EE6

答案 1 :(得分:0)

回答你的第一个问题:

@Resource(name="customerDB")
private javax.sql.DataSource myDB;

以上代码表示:使用名为myDB的DataSource注入私有字段"customerDB"。字段的名称和资源的名称是两个完全不同的东西。变量名由您决定,资源名称必须是JNDI中配置的DataSource的名称。

当然,您使用myDB来访问该字段,因为这就是该字段的名称。注释只是与常规Java类,字段和方法相关联的元数据。它们不会改变Java的工作方式:要访问字段,请使用字段的名称。不是与该字段关联的Java EE注释的名称。

关于你的第二个问题,公平地说,我不知道基于类别的注射方法以及它何时有用。