解决servlet调用spring中bean的问题
servlet是无法直接调用spring中的bean的,如果直接调用,一般都会报空指针异常。为什么会这样?其实我们使用spring的目的就是为了让spring为我们来提供一个已经被注入好的一个实例。而servlet是不同的,servlet是有生命周期的,而这个并不归属spring管理,而是由web容器管理的。那么当servlet刚刚创建的时候,spring可以为servlet注入,当你访问的时
·
servlet是无法直接调用spring中的bean的,如果直接调用,一般都会报空指针异常。
为什么会这样?其实我们使用spring的目的就是为了让spring为我们来提供一个已经被注入好的一个实例。而servlet是不同的,servlet是有生命周期的,而这个并不归属spring管理,而是由web容器管理的。那么当servlet刚刚创建的时候,spring可以为servlet注入,当你访问的时候,由于servlet是单实例多线程的,所以,servlet信息被重置,刚刚被注入的对象又为null了。
那么该怎么处理这个问题呢?其实只要我在获得servlet的时候,用从Spring获得,而不是由web容器获得就可以了。而解决这个方法的思路就是,我们使用一个代理的servlet,利用这个代理的servlet去调用我们的业务servlet(其中这个业务servlet是被配置为spring中的bean),这样就可以实现其他bean注入,然后使用代理servlet调用
具体的配置及调用代码:
代理servlet:
业务servletimport java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; /** * HttpServlet 代理 * @author lwei * @since 2011-03-17 * @version 1.0 */ public class HttpServletProxy extends HttpServlet { /** * random serialVersionUID */ private static final long serialVersionUID = -7208519469035631940L; Log logger = LogFactory.getLog(HttpServletProxy.class); private String targetServlet; private HttpServlet proxy; public void init() throws ServletException { this.targetServlet = getInitParameter("targetServlet"); getServletBean(); proxy.init(getServletConfig()); System.out.println(targetServlet + " was inited by HttpServletProxy successfully......"); } private void getServletBean() { WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); this.proxy = (HttpServlet) wac.getBean(targetServlet); } @Override public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, RuntimeException { proxy.service(request, response); } }
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.origin.mobile.factory.IDemoFactory; /** * @author 卢旭昶 */ public class UserCheckServlet extends HttpServlet { /** * random serialVersionUID */ private static final long serialVersionUID = 3075635113536622929L; private IDemoFactory idemoFactory;//UserService 是spring托管的bean,通过set方法注入 public void setIdemoFactory (IDemoFactory idemoFactory) { this.idemoFactory = idemoFactory; } public UserCheckServlet() { super(); } public void init() throws ServletException { super.init(); } @Override public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException, RuntimeException { String str = idemoFactory.testMobile(); System.out.println("=======================str:"+str); } }
web.xml配置<servlet> <servlet-name>UserCheckProxy</servlet-name> <servlet-class>com.origin.mobile.servlet.HttpServletProxy</servlet-class> <init-param> <param-name>targetServlet</param-name> <param-value>userCheckServlet</param-value><!--业务servlet配置为spring的bean时的名字--> </init-param> </servlet> <servlet-mapping> <servlet-name>UserCheckProxy</servlet-name> <url-pattern>/UserCheck.do</url-pattern> </servlet-mapping>
spring配置文件<bean id="userCheckServlet" class="com.origin.mobile.servlet.UserCheckServlet"> <property name="idemoFactory" ref="demoFactory"></property> </bean>
更多推荐
已为社区贡献1条内容
所有评论(0)