解决servlet调用spring中bean的问题
2012-02-20 12:42
381 查看
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:
web.xml配置
spring配置文件
为什么会这样?其实我们使用spring的目的就是为了让spring为我们来提供一个已经被注入好的一个实例。而servlet是不同的,servlet是有生命周期的,而这个并不归属spring管理,而是由web容器管理的。那么当servlet刚刚创建的时候,spring可以为servlet注入,当你访问的时候,由于servlet是单实例多线程的,所以,servlet信息被重置,刚刚被注入的对象又为null了。
那么该怎么处理这个问题呢?其实只要我在获得servlet的时候,用从Spring获得,而不是由web容器获得就可以了。而解决这个方法的思路就是,我们使用一个代理的servlet,利用这个代理的servlet去调用我们的业务servlet(其中这个业务servlet是被配置为spring中的bean),这样就可以实现其他bean注入,然后使用代理servlet调用
具体的配置及调用代码:
代理servlet:
import 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); } }业务servlet
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>
相关文章推荐
- 解决servlet调用spring中bean的问题
- 在servlet里面调用spring的备案出现空指针的问题
- Spring 中注入bean的properties配置文件位置问题解决
- 解决Spring整合SpringMVC时,Bean被实例化两次的问题
- Spring在Java Filter注入Bean为Null的问题解决
- 关于spring boot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案
- 解决Spring中singleton的Bean依赖于prototype的Bean的问题
- 解决Spring+Quartz无法自动注入bean问题
- 配置了 Spring AOP 但会调用两次的问题解决方法
- spring巧用继承解决bean的id相同的问题
- Servlet中调用Spring管理的Bean
- 解决服务器代码执行mvn test后在classes和test-classes下找不到Spring的bean.xml配置文件问题
- 记录问题:在springboot中servletlet调用service方法空指针异常问题
- springmvc Spring3 MVC @ResponseBody返回,jquery ajax调用中文乱码问题解决
- 解决Spring+Quartz无法自动注入bean问题
- No bean named 'springSecurityFilterChain' is defined 问题解决
- 解决spring配置中的bean类型的问题:BeanNotOfRequiredTypeException
- Spring管理的Bean对象默认是单例模式,怎么解决线程安全问题
- 解决spring中不同配置文件中存在name或者id相同的bean可能引起的问题
- spring bean id重复覆盖的问题解决