Springboot内嵌tomcat

如何获取工厂Bean

参考:https://www.cnblogs.com/lifullmoon/p/14957595.html

跟springboot启动源码,是在对构造的应用上下文对象进行刷新的时候创建的web容器

这里的应用上下文的实现类是

org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

主要看下这个类的父类 ServletWebServerApplicationContext ,他包含了一个WebServer 对象,这个就是web容器对象

在看下是在哪里初始化这个对象的,是在对应用上下文调用刷新方法的时候,初始化的,看下源码:

继续跟

继续

在这之前一直都是SpringApplication里的方法 , 下面代码就走到了AbstractApplicationContext里

最终初始化WebServer的代码是在类AnnotationConfigServletWebServerApplicationContext父类

ServletWebServerApplicationContext 实现的~~

继续跟代码发现webServer 的初始化是由工厂Bean org.springframework.boot.web.servlet.server.ServletWebServerFactory实现的,并且Bean工厂实例在IOC容器已经存在了,是在哪里配置的这个工厂Bean实例的呢, 后面发现在springboot启动的时候默认加载的自动配置类里对这个工厂Bean的配置定义

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

ServletWebServerFactoryAutoConfiguration 这个自动配置类导入了一个配置项

ServletWebServerFactoryConfiguration.EmbeddedTomcat

这个配置是实际工厂Bean 接口类 org.springframework.boot.web.servlet.server.ServletWebServerFactory

的实例org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory

类图如下

通过工厂获取WebServer对象

之前跟源码发现,在通过工厂获取WebServer的方法有个入参是Servelet容器初始化器列表,用来初始化Servlet容器,这里实际上是初始化Servlet,Filter的地方

注意org.springframework.boot.web.servlet.ServletContextInitializer是函数数接口

getSelfInitializer 这个方法其实是返回了一个实现了ServletContextInitializer 接口的匿名内部类的实例

还有这里this::selfInitialize ,是方法引用,lambda表达式的一种,使用lambda表达式会创建匿名方法, 有时候需要使用一个lambda表达式只调用一个已经存在的方法(没有其他逻辑), 所以有了方法引用(参考https://blog.csdn.net/zhoufanyang_china/article/details/87798829

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值