SpringMVC底层分析--1.DispatcherServlet启动

一.必备三个bean

我们在之前的Spring底层分析--3.ApplicationContext的实现_可爱的鸡仔的博客-CSDN博客

 中介绍过要向创建web容器,必须需要三个bean

@Configuration
public class WebConfig {
    //必须实现servlet容器
    @Bean
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }
    //必须实现dispatcherServlet
    @Bean
    public DispatcherServlet dispatcherServlet(){
        return new DispatcherServlet();
    }
    //必须吧dispatcherServlet注册到servlet容器中
    @Bean
    public DispatcherServletRegistrationBean dispatcherServletRegistrationBean(DispatcherServlet dispatcherServlet){
        //  “/”表示所有请求都先经过dispathcherServlet
        return new DispatcherServletRegistrationBean(dispatcherServlet,"/");
    }
 

}

这样我们就可以启动了

  AnnotationConfigServletWebServerApplicationContext context =
                new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);

我们启动一下

9月 22, 2023 8:28:18 上午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-nio-8080"]
9月 22, 2023 8:28:18 上午 org.apache.catalina.core.StandardService startInternal
信息: Starting service [Tomcat]
9月 22, 2023 8:28:18 上午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet engine: [Apache Tomcat/9.0.68]
9月 22, 2023 8:28:18 上午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring embedded WebApplicationContext
08:28:18.800 [main] DEBUG org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Published root 

可以看到tomcat的启动信息,

二.修改DispatcherServlet启动时机

DispatcherServlet默认是在第一次访问时创建,现在我们想让它一开始就创建好,我们只需要修改DispathcerServletRegisterBean中的load-start-up为大于0即可

        //设置初始化启动
        registrationBean.setLoadOnStartup(1);

这样一开始就被创建好了

三.将配置信息通过配置文件读取

有时候配置很多,不方便,我们需要抽取为配置文件,只需要修改配置文件中的值就可以了

我们来修改一下端口号和启动时机

创建application.properties文件

server.port=9090



spring.mvc.servlet.load-on-startup=1

然后通过注解

@PropertySource("classpath:application.properties")的方式导入配置文件

然后我们需要哪个配置信息,就把它对应的配置属性类通过

 

@EnableConfigurationProperties({WebMvcProperties.class, ServerProperties.class})

注册为bean,需要的时候调用get方法就能获得属性值了,

具体代码如下

@Configuration
@ComponentScan
@PropertySource("classpath:application.properties")
@EnableConfigurationProperties({WebMvcProperties.class, ServerProperties.class})
public class WebConfig {

    //web容器
    @Bean
    public ServletWebServerFactory servletWebServerFactory(ServerProperties serverProperties){
        return new TomcatServletWebServerFactory(serverProperties.getPort());
    }

    //dispatcherServlet
    @Bean
    public DispatcherServlet dispatcherServlet(){

        return new DispatcherServlet();
    }
    //把dispatcherServlet注册到web容器中
    @Bean
   public DispatcherServletRegistrationBean dispatcherServletRegistrationBean(
           DispatcherServlet dispatcherServlet,WebMvcProperties webMvcProperties){

        DispatcherServletRegistrationBean registrationBean =
                new DispatcherServletRegistrationBean(dispatcherServlet, "/");
        //设置初始化启动
        registrationBean.
                setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());

        return registrationBean;



    }

现在让我们再次启动:

9月 22, 2023 8:37:53 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-9090"]
9月 22, 2023 8:37:53 上午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring DispatcherServlet 'dispatcherServlet'
08:37:53.081 [main] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'

可以看到端口号成功的修改为9090,dispatcherServlet初始化就创建了!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值