4

我目前正在阅读java-ee 教程中的资源注入章节,我无法理解注入资源后使用资源的方式,或者换句话说,以何种方式可以访问它:

基于字段的注入:

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在哪条路径下?

4

2 回答 2

4

如果第一个是正确的,那么名称的目的是什么?我也可以通过查找访问它吗?

@ResourceJNDI 和大量重载注释的最大困难和混淆的主要原因是它name指的是与组件相关联的本地 ENC 空间(在 EJB bean 的情况下,它是单个 Bean)。您可以使用 . 从初始上下文访问此空间java:comp/env

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

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

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

基于类的注入是 XML 语法的注解等价物,用于将某些东西映射到组件的 ENC。恕我直言,它不能很好地转化为现代编程实践。在向 ENC 注入一些东西后,您可以InitialContext使用上述java:comp/env空间再次查找它。

例如给定

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

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

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

总而言之,这@Resource是对 Java EE 中注入的古老前体进行某种程度现代化的尝试,但由于遗留问题,它本身增加了很多复杂性。@Inject恕我直言,如果整个 Java EE 迁移到具有更清晰和更少重载的语义,那会更好。

另请参阅:在 Java EE6 中的类级别声明 @Resource 和 @EJB

于 2013-11-10T13:03:24.400 回答
0

要回答您的第一个问题:

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

上面的代码意思是:注入私有字段myDB,DataSource 名为"customerDB". 字段名和资源名是两个完全不同的东西。变量名由你决定,资源名必须是 JNDI 中配置的 DataSource 的名称。

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

关于您的第二个问题,公平地说,我不知道基于类的注入意味着什么以及何时有用。

于 2013-11-10T12:39:04.860 回答