SpringBoot 整合 SpringMVC 原理探究
閱讀本文大概需要 4 分鐘。
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-webartifactId>
dependency>
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@Import(BeanPostProcessorsRegistrar.class)
public class EmbeddedServletContainerAutoConfiguration{
????...省略代碼
}
@Override
public?void?registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry)?{
????????????if?(this.beanFactory ==?null) {
????????????????return;
????????????}
????????????if?(ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(
????EmbeddedServletContainerCustomizerBeanPostProcessor.class,?true,
????????????????????false))) {
????????????????registry.registerBeanDefinition(?"embeddedServletContainerCustomizerBeanPostProcessor",
????????????????????????new?RootBeanDefinition(
????????EmbeddedServletContainerCustomizerBeanPostProcessor.class));
????????????}
????????????if?(ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(
????????????????????ErrorPageRegistrarBeanPostProcessor.class,?true,?false))) {
????????????????registry.registerBeanDefinition("errorPageRegistrarBeanPostProcessor",
????????????????????????new?RootBeanDefinition(
????????????????????????????????ErrorPageRegistrarBeanPostProcessor.class));
????????????}
????????}
獲取所有EmbeddedServletContainerCustomizer對(duì)象
調(diào)用EmbeddedServletContainerCustomizer.customize方法
EmbeddedServletContainerCustomizer實(shí)現(xiàn)類根據(jù)自身需求設(shè)置WebServlet容器參數(shù)(如:端口號(hào)、連接數(shù)等等)
@Override
????public?Object?postProcessBeforeInitialization(Object?bean,?String?beanName)throws BeansException {
????????if?(bean?instanceof?ConfigurableEmbeddedServletContainer) { postProcessBeforeInitialization((ConfigurableEmbeddedServletContainer) bean);
????????}
????????return?bean;
????}
private?void?postProcessBeforeInitialization(ConfigurableEmbeddedServletContainer bean) {
????????for?(EmbeddedServletContainerCustomizer customizer : getCustomizers()) {
????????????customizer.customize(bean);
????????}
????}

@Override
????public final void refresh() throws BeansException, IllegalStateException {
?????????????...省略
????????????super.refresh();
?????????????...省略
????}
????@Override
????protected void onRefresh() {
????????...省略
????????//創(chuàng)建ServletContainer
????????createEmbeddedServletContainer();
?????????...省略
????}
protected?void?configureContext(Context context,
????????????ServletContextInitializer[] initializers)?{
????????TomcatStarter starter =?new?TomcatStarter(initializers);
????????if?(context?instanceof?TomcatEmbeddedContext) {
????????????// Should be true
????????????((TomcatEmbeddedContext) context).setStarter(starter);
????????}
????????...省略
????}

@Override
????public?void?onStartup(ServletContext servletContext)?throws?ServletException?{
????????Assert.notNull(this.servlet,?"Servlet must not be null");
????????String name = getServletName();
????????if?(!isEnabled()) {
????????????logger.info("Servlet "?+ name +?" was not registered (disabled)");
????????????return;
????????}
????????logger.info("Mapping servlet: '"?+ name +?"' to "?+?this.urlMappings);
????????Dynamic added = servletContext.addServlet(name,?this.servlet);
????????if?(added ==?null) {
????????????logger.info("Servlet "?+ name +?" was not registered "
????????????????????+?"(possibly already registered?)");
????????????return;
????????}
????????configure(added);
????}

@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
????????@ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
????????public?ServletRegistrationBean?dispatcherServletRegistration(
????????????????DispatcherServlet dispatcherServlet)?{
????????????ServletRegistrationBean registration =?new?ServletRegistrationBean(
????????????????????dispatcherServlet,?this.serverProperties.getServletMapping());
????????????registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
????????????registration.setLoadOnStartup(
????????????????????this.webMvcProperties.getServlet().getLoadOnStartup());
????????????if?(this.multipartConfig !=?null) {
????????????????registration.setMultipartConfig(this.multipartConfig);
????????????}
????????????return?registration;
????????}
推薦閱讀:
是誰投了特朗普?黑客在暗網(wǎng)出售美國1.86億選民數(shù)據(jù),F(xiàn)BI介入
如何實(shí)現(xiàn) MySQL 刪除重復(fù)記錄并且只保留一條
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?
評(píng)論
圖片
表情

