2010-04-30 61 views
3

我在ServletContextListener的contextInitialized(...)方法中实例化的类中使用@Resource注释,但该成员始终为空。这是我的示例代码。@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); 
} 

如果我切换的意见和运行手册资源查找,它工作正常。

@Resource注解应该如何在contextInitalized方法中使用?

Appserver是WAS 7.0.0.5,如果它应该工作,那么我想这是一个错误?有人可以确认吗?

回答

1

需要考虑的另一件事是资源注入只能在由容器创建的对象上工作,所以即使资源已经存在于contextInitialized调用中,这也不起作用,因为它是您的代码创建的ResourceListenerTargetTest实例,WAS不知道你打算注入资源。

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

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

2

补给它。 Bug。前喷射目标是从喷射发动机检索

Web容器码被初始化 的servlet。因此,如果servlet初始化 取决于注入的资源,则可能会出现问题。

因此,如果在任何servlet可以加载之前调用contextInitialized,则必须应用相同的问题。