我在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,当在从对象内部代理的对象上调用方法时,该方法调用不会被拦截(如果有意义).