问题描述
您正在混淆两个概念:Servlet和Spring的ApplicationContext
。Servlet由Servlet容器管理,以Tomcat为例。在ApplicationContext
由Spring管理。
Servlet
在部署描述符中将a声明为
<servlet>
<servlet-name>servletOne</servlet-name>
<servlet-class>mypackage.servletOne</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletOne</servlet-name>
<url-pattern>/servletOne</url-pattern>
</servlet-mapping>
Servlet容器将创建您的mypackage.servletOne
类的实例,进行注册,并使用它来处理请求。这就是DispatcherServlet
Spring
MVC的基础。
Spring是一个IoC容器,用于ApplicationContext
管理许多bean。该ContextLoaderListener
负载根ApplicationContext
(无论从任何位置,你告诉它)。在DispatcherServlet
使用了根上下文,因此也必须加载其自身。上下文必须具有适当的配置DispatcherServlet
才能工作。
在Spring上下文中声明一个bean,例如
<bean id="servletFirst" class="mypackage.servletOne">
<property name="message" ref="classObject" />
</bean>
就像我在这里的答案一样,因为ContextLoaderListener
将ApplicationContext
它创建的putsServletContext
作为属性,所以ApplicationContext
任何Servlet容器托管对象都可以使用它。因此,您可以像这样HttpServlet#init(ServletConfig)
在自定义HttpServlet
类中覆盖
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ApplicationContext ac = (ApplicationContext) config.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
this.someObject = (SomeBean)ac.getBean("someBeanRef");
}
假设您的根ApplicationContext
包含一个名为的bean someBeanRef
。
解决方法
我的应用程序中有两个servlet,并且我希望将一个A类的对象注入到这两个servlet中,并且我还希望在整个应用程序中使用相同的ApplicationContext,即在此问题的第一个答案中提到的两个servlet:
春季注入Servlet
现在,我经历了许多这样的问题,但是找不到与我的问题完全匹配的东西。为了更好地说明问题,我在这里写一个粗糙的代码:
public class servletOne extends HttpServlet {
protected void processRequest(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
}
}
public class servletTwo extends HttpServlet {
protected void processRequest(HttpServletRequest request,IOException {
}
}
因此,上面是applicationContext.xml中的两个服务对象,我想将一个对象传递给这两个servlet,因此按照常规约定,我需要这样的功能:
<bean id="servletFirst" class="mypackage.servletOne">
<property name="message" ref="classObject" />
</bean>
<bean id="servletFirst" class="mypackage.servletTwo">
<property name="message" ref="classObject" />
</bean>
<bean id="classObject" class="mypackage.classA">
</bean>
我不知道这是否可行,我是Spring的新手,我只有依赖注入的基本知识。
如果有人可以帮助我,我将非常感谢。这将消除我的许多疑问,并帮助我在学习Spring的过程中前进。
这是web.xml
<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>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>servletOne</servlet-name>
<servlet-class>mypackage.servletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>servletTwo</servlet-name>
<servlet-class>mypackage.servletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servletOne</servlet-name>
<url-pattern>/servletOne</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servletTwo</servlet-name>
<url-pattern>/servletTwo</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
300
</session-timeout>
</session-config>
</web-app>