Spring Boot 中的调度程序 Servlet

Posted

技术标签:

【中文标题】Spring Boot 中的调度程序 Servlet【英文标题】:Dispatcher Servlet in Spring Boot 【发布时间】:2015-11-05 23:54:51 【问题描述】:

在包装类型为 war 的 Spring Boot 应用程序中,我正在配置 Spring MVC。据我了解,我们不必手动配置 Dispatcher Servlet。但是,我使用旧样式的 web.xml 来配置 Dispatcher Servlet,然后我用来传递 contextClass 和 contextConfigLocation 如下

<servlet>
    <description>
    </description>
    <display-name>DispatcherServlet</display-name>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <description>contextClass</description>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>
    <init-param>
        <description>contextConfigLocation</description>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.xxx.yyy.jdorderspringmvcweb.config.SpringMvcConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>      

我相信这是为了表明 SpringMvcConfig(我的带有 spring mvc 配置的自定义类)是 Spring MVC 的配置类..

但是,在 Spring Boot 中,如果 Dispatcher Servlet 是自动配置的,我如何将我的自定义类传递给 dispatcher Servlet?

在我的 Spring Boot 应用程序中,我的 SpringMvcConfig 类从 WebMvcConfigurerAdapter 扩展而来,并使用 @Configuration 类进行注释

需要帮助...

【问题讨论】:

【参考方案1】:

我认为你必须创建一个配置类如下:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 

    @Override
    protected Class<?>[] getRootConfigClasses() 
        // TODO Auto-generated method stub
        return null;
    

    @Override
    protected Class<?>[] getServletConfigClasses() 
        return new Class[]  DemoAppConfig.class ;
    

    @Override
    protected String[] getServletMappings() 
        return new String[]  "/" ;
    


【讨论】:

【参考方案2】:

在由@Configuration 注释的配置类中,您可以定义您的dispatcherServlet 并将init-parameter 传递给它。

@Bean
public ServletRegistrationBean dispatcherServletRegistration() 
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(dispatcherServlet());
    registrationBean.addInitParameter("contextClass","org.springframework.web.context.support.AnnotationConfigWebApplicationContext");  
    registrationBean.addInitParameter("contextConfigLocation","com.xxx.yyy.jdorderspringmvcweb.config.SpringMvcConfig");
    return registrationBean;

另一种方法是创建一个参数映射,然后为注册 bean 设置参数。 This 流显示了如何做到这一点。

【讨论】:

您还没有回答问题。您的代码显示dispatcherServlet(),但没有说明这是什么或它是如何定义的——这就是问题所在。

以上是关于Spring Boot 中的调度程序 Servlet的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 批处理调度程序运行一次

Spring Boot 应用启动后调用方法

在 Spring Boot 中使用多个调度程序 Servlet/Web 上下文

如何使用 Spring Boot 和 Flyway 为 Quartz 调度程序设置数据库模式?

将已有的spring app迁移到spring-boot,手动配置spring-boot?

SpringBoot系列:Spring Boot集成定时任务Quartz