首页 > 编程语言 > 详细

SpringBoot如何默认引入Tomcat,并自动装配

时间:2021-08-29 19:27:16      阅读:31      评论:0      收藏:0      [点我收藏+]

SpringBoot引入Tomcat

其实就是直接在pom.xml文件默认引入Tomcat的。。。。

 1     <dependency>
 2       <groupId>org.springframework.boot</groupId>
 3       <artifactId>spring-boot-starter-json</artifactId>
 4       <version>2.3.7.RELEASE</version>
 5       <scope>compile</scope>
 6     </dependency>
 7     <dependency>
 8       <groupId>org.springframework.boot</groupId>
 9       <artifactId>spring-boot-starter-tomcat</artifactId>
10       <version>2.3.7.RELEASE</version>
11       <scope>compile</scope>
12     </dependency>

自动装配

1. 通过spring-boot-autoconfigure的spring.factories中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration,值为ServletWebServerFactoryAutoConfiguration引入配置文件

技术分享图片

2. 通过@import注解引入EmbeddedTomcat的bean技术分享图片

3. 可以看到这里有@ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })注解,由于spring-boot-web默认引入Tomcat.jar,所以这里会进行bean的注入,

ServletWebServerFactoryAutoConfiguration类上的注解,其实也引入了Jetty、undertow,只是没有相应的jar包,所以没有注入相应的bean

技术分享图片

 

4. 注入bean之后,怎么启动Tomcat呢?答案就在org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext里面createWebServer方法,这里类也是继承AbstractApplicationContext类的

技术分享图片

5. 该方法里面会调用通过bean的byType去找servlet工厂bean,至此就找到第三步注入的bean--TomcatServletWebServerFactory

 1 protected ServletWebServerFactory getWebServerFactory() {
 2         // Use bean names so that we don‘t consider the hierarchy
 3         String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
 4         if (beanNames.length == 0) {
 5             throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to missing "
 6                     + "ServletWebServerFactory bean.");
 7         }
 8         if (beanNames.length > 1) {
 9             throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to multiple "
10                     + "ServletWebServerFactory beans : " + StringUtils.arrayToCommaDelimitedString(beanNames));
11         }
12         return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
13     }

6. 剩下就是调用Tomcat工厂实现socket的监听了,具体可以参考 https://blog.csdn.net/qq_31086797/article/details/107418371

 

SpringBoot如何默认引入Tomcat,并自动装配

原文:https://www.cnblogs.com/volun/p/15201613.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!