2010-04-30 101 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,則必須應用相同的問題。