【问题标题】:@Resource annotated member not injected - bad code or bug?@Resource 注释成员未注入 - 错误代码或错误?
【发布时间】:2010-04-30 16:11:10
【问题描述】:

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

听众:

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);
}

如果我切换 cmets 并运行手动资源查找,它工作正常。

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

Appserver 是 WAS 7.0.0.5,如果它应该工作那么我猜这是一个错误?谁能确认一下?

【问题讨论】:

    标签: java servlets annotations websphere


    【解决方案1】:

    该死的。 Bug.

    Webcontainer 代码正在初始化 注入目标之前的 servlet 从注入引擎中检索。 因此,如果 servlet 初始化 取决于注入的 资源,可能会出现问题。

    因此,由于在加载任何 servlet 之前调用了 contextInitialized,因此必须应用相同的问题。

    【讨论】:

      【解决方案2】:

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

      或者至少我希望它不会。否则,WAS JVM 将不得不拦截每个单独的对象创建,并确保特定对象不需要注入,否则会损害性能。

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

      【讨论】:

        猜你喜欢
        • 2018-11-02
        • 2020-06-08
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        相关资源
        最近更新 更多