资源注射是从JavaEE 5.0开始出现,实现了Tomcat在启动时自动将web.xml中的配置信息“注射”到Servlet中。资源注射是通过Annotation完成,Annotation是一种特殊的接口,以"@"为标志,用法如下:
@Resource (name="messageNameInWebXml")
private String message;
有时为了简洁,上面的两行代码可以缩写为一行:
private @Resource(name="messageNameInWebXml") String message;
加入@Resource注释后,Tomcat会在Servlet运行时将变量message的值注入,这个值设置在web.xml中名为messageNameInWebXml的参数中。
下面用实例来说明:
package com.hello.servlet;import java.io.*;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.*;public class InjectionServlet extends HttpServlet{private @Resource(name="hello") String hello;private @Resource(name="i") int i;@Resource(name="persons")private String persons;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{response.setCharacterEncoding("UTF-8");request.setCharacterEncoding("UTF-8");response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("");out.println("");out.println("");out.println("");out.println("注入的字符串:
- " + hello +"
");out.println("注入的整数:
- " + i +"
");out.println("注入的字符串数组:
");for(String person : persons.split(",")){out.println(" - " + person +"
");}out.println("");out.println("");out.println("");out.flush();out.close();}
}
下一步,在web.xml中使用标签来配置资源。仅能配置java.lang包下标准类型的变量,如String, Integer, Double等。配置后的代码如下:
InjectionServletcom.hello.servlet.InjectionServlet
InjectionServlet/servlet/InjectionServlet
hellojava.lang.StringHello, Welcome to the JavaEE Resource Injection
ijava.lang.Integer14
personsjava.lang.StringHelloween, Cobain, Roses, WLJ,
资源注射的原理:JNDI
InjectionServlet实例中使用配置了名为hello, i, persons的JNDI资源,然后使用@Resource将指定名称的JNDI资源注射到InjectionServlet里。如果不使用@Resource,直接通过JNDI也可以获取这三个参数,代码如下:
Context ctx = new InitialContext();
String message = (String)ctx.lookup("message");
Integer i = (Integer)ctx.lookup("i");
String persons = (String)ctx.lookup("persons");
注:参考《Java Web整合开发》一书