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

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

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

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

1.通过配置文件的方式配置

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

  

  而且我们可以点开这个端口,可以发现

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

 

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

 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的做法,这些东西会总结一下。

带着萌新看springboot源码07的更多相关文章

  1. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

  2. 带着萌新看springboot源码05

    上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...

  3. 带着萌新看springboot源码8(spring ioc源码上)

    emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...

  4. 带着萌新看springboot源码03

    上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...

  5. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  6. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  7. 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)

    上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...

  8. 带着萌新看springboot源码09(springboot+JdbcTemplate)

    emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...

  9. 带着萌新看springboot源码04

    继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了. 这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 . 1.梳理一下spri ...

随机推荐

  1. avue的小白之路

    经过几天的看实例,我稍稍了解到了avue,写这个博客主要是最近学习avue的一个总结.. avue是基于vue与element ui的一个框架,强烈建议等了解这其中道理在学习avue会事半功倍:这是我 ...

  2. Java 扫描实现 Ioc 动态注入,过滤器根据访问url调用自定义注解标记的类及其方法

    扫描实现 Ioc 动态注入 参考: http://www.private-blog.com/2017/11/16/java-%e6%89%ab%e6%8f%8f%e5%ae%9e%e7%8e%b0-i ...

  3. iOS键盘事件实现、控制

    记录于2013/6/26:   一.点击键盘上的“Done”按钮关闭键盘 1.视图控制器实现UITextFieldDelegate协议 2.设置文本框属性      textField.returnK ...

  4. Centos7使用kubeadm部署kubernetes-1.11.2

    1.安装方式 1.  传统方式,以下组件全部运行在系统层面(yum或者rpm包),都为系统级守护进程 2.  kubeadm方式,master和node上的组件全部运行为pod容器,k8s也为pod ...

  5. Largest Rectangle in a Histogram [POJ2559] [单调栈]

    题意一个围挡由n个宽度为1的长方形挡板下端对齐后得到,每个长方形挡板的高度为hi.我们把其抽象成一个图形,问这个图形中包含的面积最大的长方形是多大? 输入多行数据,每行第一个为n,后面n个数,代表hi ...

  6. pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

    数据介绍 先随机生成一组数据: import pandas as pd import numpy as np state = ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'N ...

  7. leetcode-求众数

    题目:求众数 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3 ...

  8. 转 the best for wcf client

    原文:http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-bl ...

  9. 《SpringMVC从入门到放肆》十、SpringMVC注解式开发(复杂参数接收)

    上一篇我们学习了简单的参数接收方式,以及对编码的统一处理.今天我们来接收对象参数. 一.接收对象参数 jsp页面: <%@ page language="java" impo ...

  10. [AtCoder 2702]Fountain Walk - LIS

    Problem Statement In the city of Nevermore, there are 108 streets and 108 avenues, both numbered fro ...