Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Spring中管理JavaServlet(或DI)?_Java_Spring_Tomcat_Servlets_Dependency Injection - Fatal编程技术网

如何在Spring中管理JavaServlet(或DI)?

如何在Spring中管理JavaServlet(或DI)?,java,spring,tomcat,servlets,dependency-injection,Java,Spring,Tomcat,Servlets,Dependency Injection,我有一个包含一些旧的HttpServlet的项目,我想要一种在Spring中管理Servlet的创建/生命周期的方法,这样我可以做一些事情,比如DI,并通过Spring/Hibernate集成传入数据库对象 首先,我在web.xml中设置了Spring应用程序上下文,如下所示 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WE

我有一个包含一些旧的HttpServlet的项目,我想要一种在Spring中管理Servlet的创建/生命周期的方法,这样我可以做一些事情,比如DI,并通过Spring/Hibernate集成传入数据库对象

首先,我在
web.xml
中设置了Spring应用程序上下文,如下所示

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<bean id="oldHttpServlet" class="com.package.MyServlet"></bean>
在我的Spring
application context.xml中,我想做一些bean定义,如下所示

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<bean id="oldHttpServlet" class="com.package.MyServlet"></bean>
和MyServlet

class MyAbstractServlet extends HttpServlet{
  doPost(){
     //Some post implementation here...
  }
}
在Spring中包装MyServlet并从那里加载而不是通过web.xml实例化的最佳方法是什么


我假设最好的方法是使用Springs
HttpRequestHandler
,然后使用web.xml中的
HttpRequestHandlerServlet
来代替当前的servlet。但是,我不确定如何实现HttpRequestHandler接口来处理myAbstractServlet中现有的doPost()内容

Servlet的理想用途应该是作为控制器,底层容器管理其生命周期,因此我们不需要Spring来管理其实例

所以我可以做一些事情,比如DI和通过Spring/Hibernate集成传入数据库对象


在dao/服务中永远不应该有Servlet的依赖关系,如果需要将依赖关系注入Servlet,您的Servlet应该调用非常适合使用Spring DI上下文管理的服务,而不是使用Spring的HttpRequestHandlerServlet。创建HttpRequestHandler的实现(它有一个方法:

public void handleRequest(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException;
您需要实现的功能—它与doGet/doPost中的功能相当。 所有HttpRequestHandler实现的实例都应该由spring处理(设置注释驱动的配置并使用@Component对其进行注释),或者使用XML配置来设置这些bean

在web.xml中创建HttpRequestHandlerServlet的映射。如果您将servlet命名为与HttpRequestHandler相同的名称,则Spring将使HttpRequestHandlerServlet使用匹配的HttpRequestHandler自动处理请求

由于HttpRequestHandler是一个Springbean,您可以让Spring将您需要的所有服务注入其中

如果您仍然不想使用HttpRequestHandler代替servlet,那么剩下的就是一些“编程柔道”,比如使用Spring UTIL检索WebApplicationContext,然后通过“每个名称”从中获取beanServlet不是由Spring实例化的,因此它无法管理它们。您必须为您的Servlet创建一个基类,并将DI作为初始化步骤进行管理

代码如下所示(在servlet中):

[编辑] 事实上,正如一位评论者所建议的,还有一个选项。它仍然需要您在servlets init方法中进行手动设置。下面是这样的情况:

public void init(ServletConfig config) {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}

您也可以在Servlet上使用@Configurable annotation with wiven试试运气,但这可能会起作用,也可能不会起作用(我认为Servlet可能在Spring上下文设置之前初始化,因此它仍然无法发挥其魔力)。

关于SpringBeanAutowiringSupport,javadoc中的注意:


注意:如果存在访问ServletContext的显式方法,请选择这种方法,而不要使用此类。WebApplicationContextUtils类允许轻松访问基于ServletContext的Spring根web应用程序上下文。

您不能在Spring中创建servlet,容器决定何时以及有多少个Servlet实例访问c创建,您可以手动自动连接servlet字段,谢谢,这正是我要找的!我不确定您在这里的意思。我想@autowire things(services)在MyServlet中,要实现这种自动连接,我需要让Spring知道MyServlet实例……我能做到这一点而不必重新编写一半的服务器核心,也就是说,通过某种方式包装它吗?我已经给出了解决问题的建议。您需要将servlet迁移为HttpReqestHandler,但签名是same.Spring没有办法在servlet上实现这一点。是的,你可以制作一个ServiceLocator,从Spring上下文读取bean并返回它,你是在使用原始servlet还是在servlet上使用SpringMVC框架?
SpringBeanAutowiringSupport.autowire(这个,config.getServletContext())
inside
init(config)
已经停止工作了?:D或者我遗漏了什么这是我在想的…但是我怎么能保留我当前的doGet/doPost代码并将其包装在handleRequest中呢?例如,handleRequest是一个调用doPost等方法的包装器?如果你真的必须重用旧的servlet,那么你可以创建一个由spring管理的servlet实例从HandlerRequest调用它,但我认为这与重构servlets成为HttpRequestHandlers.PS的工作量相同。你确定不想使用MVC框架吗?Spring MVC感觉非常轻量级!如果Spring MVC比Spring重,那么Spring也可能比Spring重-你可以查看Guice(由Google提供)-它很容易与纯servlet集成。感谢您的编辑!这是我在@Boris Treukhov评论中指出的方法。谢谢。
public void init(ServletConfig config) {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}