我正在阅读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
但是在哪条路上?
答案 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注释的名称。
关于你的第二个问题,公平地说,我不知道基于类别的注射方法以及它何时有用。