带着萌新看springboot源码07

  【修改】很长时间没看这个,有点弄混淆了。bean后置处理器(BeanPostProcessor)应该是在bean建立实例而且赋值好了以后,调用初始化方法(至关于xml配置中<bean init=“初始化方法”>)的先后会调用后置处理器的那两个方法。spring

  上一节在springboot中配置了servlet三大组件以及嵌入式servlet容器,而且还简单的说了如何切换不一样的容器。tomcat

  这一节就来讲说如何改变servlet容器的配置参数,通常有两种常见的方式,第一种:配置文件(properties和yml);第二种:往容器里添加组件的方式springboot

  注意注意:我这里说的容器和嵌入式容器不同的,容器指的是ioc容器,嵌入式servlet容器值得是servlet容器,不要混淆了jsp

1.经过配置文件的方式配置spa

  yml为例,下图所示,这是配置容器启动的端口翻译

  

  并且咱们能够点开这个端口,能够发现3d

  而这个ServerProperties的不少属性,port,adress,serverPath等等均可以在配置文件中server.xxx=xxxxx进行修改。server

    

  在这个类中,起做用的主要是这个customize方法来设置容器的属性xml

 

 2.经过嵌入式servlet容器定制器设置(这种配置比上面优先级高)对象

  随便找个配置类,以下代码(也能够配置其余属性,我用最简单的port演示一下)

  

  能够启动容器,看控制台,8082端口,启动成功,并且覆盖了yml配置的8080端口,这种方式的优先级更高。

 

3.一块儿来剖析原理(Tomcat为例)

  咱们能够发现这两种的本质是同样的,最终都是向容器里添加一个嵌入式servlet容器定制器,执行其中的customize方法。

  那么,咱们从哪里入手呢?(不用想,确定是自动配置类啊,记住,一切配置入手都是从自动配置类开始)

  打开一个叫作EmbeddedServletContainerAutoConfiguration的类,翻译就叫作嵌入式servlet容器自动配置。

 

 

     重点是这个自动配置类里面的配置(就以默认的tomcat为例) 

 

  只要添加了tomcat的依赖,会为ioc容器里面添加Tomcat的嵌入式servlet容器工厂,打开这个容器工厂

  

  点开这个类以后。咱们主要看这里

  一直到这里,tomcat的配置都过了一遍,总结一下啊:只要EmbeddedServletContainerAutoConfiguration这个配置类生效------->向ioc容器导入TomcatEmbeddedServletContainerFactory组件---------->这个tomcat嵌入式容器工厂里面会建立正常Tomcat容器对象---------->而后进行封装成嵌入式类型的容器,内部会直接启动Tomcat,从这里能够大概看出来先启动的ioc容器,而后再是Tomcat容器

  是否是还忘记了前面说的,这个自动配置类要起做用,会提早在ioc容器中导入一个注册器,这个组件很关键,他会在EmbeddedServletContainerAutoConfiguration自动配置类以前先给容器中注册一些后置处理器,在ioc容器中知足条件的Bean建立对象而且赋值好了,调用初始化方法以前,会作一些准备工做,下面咱们打开这个注册器BeanPostProcessorsRegistrar,看看注册了哪些后置处理器(BeanPostProcessors),打开这个来,看这里

 

 

  打开这个嵌入式servlet容器定制器的后置处理器(这个单词够长......),打来这个很长的后置处理器,看这个方法

 

  

  到这里就差很少了,一个很大的循环,和最开始的嵌入式servlet容器定制器连接起来了,哈哈,剖析了清楚了,仍是很容易的,并且,上图中咱们还能够看看getCustomizers()是怎么获取全部的定制器的,点开这个方法

 

   最后这个是一个简单的方法,就是容器中按照某种类型获取某些组件,而后保存起来,供别的方法遍历,每个都去执行一个方法,这种模式在springboot中大量的能够看到。

  由于这一节东西比较多,我就总结一下。

  总结全过程:启动springboot应用,建立ioc容器(这个过程我也会找个时间好好说一下ioc容器建立全过程,这里暂时掠过)---------->刷新ioc容器----------->会导入不少的自动配置类,其中就有一个EmbeddedServletContainerAutoConfiguration,这个配置类起做用,又会往ioc容器中导入后置处理器的注册器(BeanPostProcessorsRegistrar)向容器中导入那个很长的后置处理器(EmbeddedServletContainerCustomizerBeanPostProcessor),还会导入tomcat容器工厂(TomcatEmbeddedServletContainerFactory)----------->在这个容器工厂内部就会建立tomcat容器,而后进行一些参数的配置,再包装成嵌入式tomcat,同时咱们配置的嵌入式容器定制器(EmbeddedServletContainerCustomizer)加载到ioc容器里,这个时候就会触发那个很长的后置处理器去拿到容器里全部的嵌入式容器定制器,遍历,执行customize方法也为嵌入式tomcat配置一些参数(固然,这些配置是咱们写的,优先级更高)---------->tomcat启动

  哎,水平有限只能分析到这里,仍是说一句,这里只是粗略的说了一下原理,真实状况下会更加复杂,等我何时水平到了,再继续分析吧!

  后面,我会分析分析springboot从启动开始怎么工做,包括ioc容器的建立过程(这个其实属于spring注解版的内容);以及springboot不用嵌入式Tomcat,并支持jsp的作法,这些东西会总结一下。

相关文章
相关标签/搜索