当前位置: 首页 > 面试题库 >

我想使用Spring在Servlet中注入对象

洪子晋
2023-03-14
问题内容

我的应用程序中有两个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, HttpServletResponse response)
            throws ServletException, 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>

问题答案:

您正在混淆两个概念: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类的实例,进行注册,并使用它来处理请求。这就是DispatcherServletSpring
MVC的基础。

Spring是一个IoC容器,用于ApplicationContext管理许多bean。该ContextLoaderListener负载根ApplicationContext(无论从任何位置,你告诉它)。在DispatcherServlet使用了根上下文,因此也必须加载其自身。上下文必须具有适当的配置DispatcherServlet才能工作。

在Spring上下文中声明一个bean,例如

<bean id="servletFirst" class="mypackage.servletOne">
        <property name="message" ref="classObject" />
</bean>

不管它与<servlet>web.xml中声明的类型是否相同,都是完全无关的。上面的bean与<servlet>web.xml中的声明无关。

就像我在这里的答案一样,因为ContextLoaderListenerApplicationContext它创建的puts
ServletContext作为属性,所以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



 类似资料:
  • 问题内容: 1)在我的Spring应用程序上下文中声明bean 2)覆盖我的servlet的init方法,如下所示: 这项工作还是Spring目前尚未准备好在Web应用程序部署中将bean交付给我的servlet?我是否需要做一些更传统的事情,例如放入豆子web.xml? 问题答案: 您要尝试做的将使每个实例Servlet都有其自己的ApplicationContext实例。也许这就是您想要的,但

  • 文件src/main/webapp/WEB-INF/web.xml包含用于引导CDI的servlet侦听器和BeanManager引用: 通过这些设置,在使用mvn Jetty运行应用程序时,我总是遇到以下错误:run(第一行是最重要的): 应用程序正在运行,但正如异常消息所述:CDI注入在servlet中不可用。 在src/main/resources/log4j.properties中,我增加

  • 问题内容: 我是JAX-RS的新手,我试图了解注释的工作方式。 在javadoc中有六个等级的列表()。但是,我在网络上找到将this注释与其他类型一起使用的代码,例如: 是否有可以与此注释一起使用的受支持类型的列表?在执行标准之间,此列表是否会更改? 我目前正在试验Jersey,我担心自己写的代码无法移植到其他JAX-RS实现中。 问题答案: 铆接的JAX-RS 规范定义了你可以通过注入的所有标

  • 我是 JAX-RS 的新手,我正在尝试了解注释应该如何工作。 在javadoc中有一个包含六个类的列表(< code >应用程序、< code>UriInfo、< code >请求、< code>HttpHeaders、< code >安全上下文、< code >提供者)。但是,我在网上找到了将this批注用于其他类型的代码,例如: 是否有可用于此批注的支持类型列表?该列表在标准实施期间是否发生变

  • 我试图实现这样的东西 但我不知道这是否可行有人能帮我谢谢你