java-@Resource注解的成员未注入-错误的代码或错误?

我在ServletContextListener的contextInitialized(…)方法实例化的类中使用@Resource批注,但该成员始终为null.这是我的示例代码.

听众:

public void contextInitialized(ServletContextEvent sce) {
  System.err.println("In contextInitialised");
  new ResourceListenerTargetTest().executeMe(); 
}

ResourceListenerTargetTest:

@Resource(name="MyJDBCResource")
private DataSource source;
public void executeMe() {

  /*try {
    InitialContext ictx = new InitialContext();
    source = (DataSource)ictx.lookup("java:comp/env/MyJDBCResource");
  } catch (NamingException e) {
  e.printStackTrace();
  }*/

  System.err.println("source is " + source);
}

如果我切换注释并运行手动资源查找,则可以正常工作.

在contextInitalized方法中使用@Resource批注时,应该像这样工作吗?

Appserver是WAS 7.0.0.5,如果它可以正常工作,那么我想这是一个错误?谁能确认?

解决方法:

要考虑的另一件事是,资源注入将仅对由容器创建的对象起作用,因此,即使资源已在您的contextInitialized调用中存在,也不会起作用,因为是您的代码创建了ResourceListenerTargetTest实例, WAS不会知道您打算注入资源.

或者至少我希望不会.否则,WAS JVM将必须拦截每个单个对象的创建,并确保特定对象不需要注入,这将对性能造成不利影响.

类似的/相关的原理适用于AOP,当在从对象内部代理的对象上调用方法时,该方法调用不会被拦截(如果有意义).

上一篇:启动MySQL报错:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (1006


下一篇:java-Servlet请求getparameter的性能