一.必备三个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初始化就创建了!