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

  要说起spring,最重要的就是创建ioc容器的全过程,也可以叫做生命周期。

  所谓的ioc容器就是实现类;我们常看到的,有一个最顶层的BeanFactory接口,还有一个子接口ApplicationContext,其实现类都可说是ioc容器(称呼很笼统),只是ApplicationContext功能更强大,而且可以通过配置文件来实现功能,所以我们用这个接口的实现类(比如我们测试时候ApplicationContext ctx = new ClassPathXmlApplicationContext("com/yf/context/beans.xml");)比较多;

  其实,就我感觉,ioc容器的生命周期有一条主线:ioc容器创建(其实就是类实例化,但是还没有属性赋值等操作)-------->加载所有bean的定义信息-------->创建bean的实例--------->属性赋值(调用bean的setxxx方法)---------->假如bean实现了xxxAware接口,就执行setXXX方法---------->执行初始化方法(相当于xml<bean init-method="初始化方法">)----------->ioc容器创建完成,执行一些逻辑代码------------->Web应用关闭,ioc容器销毁。

  跟着这条主线,然后再执行很多的后置处理器(xxxPostProcessor)的方法(大多是xxxBeforexxx,xxxAfterxxx,postxxx方法),换句话来说,只要我们搞清楚了这些后置处理器什么时候添加到容器内?什么时候执行?有什么效果?那么ioc容器的原理就差不多一目了然了。

提前准备(依赖,随便一个类,配置类,测试方法):

  

  点开这个类AnnotationConfigApplicationContext,加载新建ioc容器,加载配置文件读取信息知道就可以了,来看看refresh方法

  最好可以自己亲自调试一步一步的看过程,我这里只会大概说一下。

  下面就来简要说说这12个流程

1.刷新前的准备工作(prepareRefresh)

2.获取容器(obtainFreshBeanFactory())

 

  

  点开this.beanFactory就到了如下这个类

  然后就是将这个新创建的容器返回,并打印日志到控制台就ok了,没啥好说的

3.对BeanFactory进行预准备工作(prepareBeanFactory)

4.对BeanFactory准备完成后做一些进一步处理的工作

  点开这个方法,你会发现这是一个空方法,留给你自己实现的。你可以继承本类或者子类,然后在容器创建完成并且准备工作做完之后,把BeanFactory返回给你,看你还需不需要再自定义一些其他的什么鬼。

5.执行BeanFactory的后置处理器(invokeBeanFactoryPostProcessors(beanFactory)   )

  

  

  下面注意后置处理器的两个接口:BeanFactoryPostProcessor接口和它的子接口BeanDefinitionRegistryPostProcessor,先执行实现了后面的这个接口的所有后置处理器,在执行所有实现了前面的这个接口的后置处理器。

  后面就是拿到容器BeanFactory里面的所有BeanDefinitionRegistryPostProcessor,按照这三种:实现PriorityOrdered接口,实现Ordered接口,没实现这两个接口;分别进行分类,添加到中间容器(currentRegistryProcessors),然后分别排序,添加到registryProcessors的容器里面(这三种后置处理器最终都是放到这里),分别遍历中间容器,执行。(由于过程重复,就以实现PriorityOrdered接口的为例)

  

  现在再执行所有实现了BeanFactoryPostProcessor这个接口的后置处理器(里面肯定是遍历,然后分别执行)

  假如BeanFactory不是BeanDefinitionRegistry接口的实现类,不用什么排序啊什么的,就直接执行所有的后置处理器

  

  然后,后面的代码和这上面差不多,也是拿到所有的BeanFactory的后置处理器,然后各种分类,但是我还是想不通不是应该都执行完了所有的BeanFactory的后置处理器了吗?emmmmm,.....水平有限,网上找了找,还真的找到了。

  原话是:”以上逻辑执行了所有参数传入的和以bean定义方式存在的BeanDefinitionRegistryPostProcessor,也执行了所有参数传入的BeanFactoryPostProcessor, 但是尚未处理所有以bean定义方式存在的BeanFactoryPostProcessor, 下面的逻辑处理这部分 BeanFactoryPostProcessor.“

  看来是上面这种处理还有些遗漏了BeanFactory后置处理器,后面再补充一下。对此我只想说,我勒个去,太特么严谨了。。。。小的服了@_@!

   然后继续运行就到第六步了,第六步下一节再一起看。

前面这五步也是粗略的看了看源码,有个印象,很多的细节我都略过去了(偷个懒),不然,还能再写很多。。。。。

 

带着萌新看springboot源码8(spring ioc源码上)的更多相关文章

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

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

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

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

  3. 带着萌新看springboot源码05

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

  4. 带着萌新看springboot源码03

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

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

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

  6. 带着萌新看springboot源码8(spring ioc源码下)

    继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...

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

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

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

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

  9. 带着萌新看springboot源码04

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

随机推荐

  1. WWH——学习方法理解与分析

    WWH是"What+Why+How"的简称,是对学习方法最完美的概括."如果不按照WWH这种模式来教学,90%的结果是老师没教好,学生学不好." 1.What( ...

  2. 单调栈&单调队列入门

    单调队列是什么呢?可以直接从问题开始来展开. Poj 2823 给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数. 数列长度:\(N <=10^6 ,m<=N\) 解法① ...

  3. 微信跳转,wap网页跳转微信打开指定页面

    最近一朋友的客户有这么一需求,wap网页跳转微信打开指定页面,让用户去关注公众号.想这么干,通过网页跳转到微信并打开带有二维码的网页,用户长按识别二维码就可以关注了.想法很好,于是去搜索了“微信跳转, ...

  4. springmvc ajax tomcat简单配置实现跨域访问

    发现一种改动最小也能实现跨域请求的方法 服务端 服务端修改web.xml配置文件, 增加过滤器 (不用导入任何jar包, 用的tomcat自带jar) <!-- 支持跨域请求 --> &l ...

  5. 小飞机ss端口被占用处理

    如图所示: 解决方法: 1.运行cmd 2.输入命令:netstat -aon|findstr "1080" 3.获取使用该端口的PID---“8540”,如下图所示: 4.输入命 ...

  6. Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

    提示哪个引用修改哪个引用的属性: Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, ...

  7. 《SpringMVC从入门到放肆》十四、SpringMVC分组数据校验

    上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验. 一.什么是分组校验 校验规则是定义在实体中的,而同一个实体可以被多个Con ...

  8. Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口介绍 在Go语言中接口(interface)是一种类型,一种抽象的类 ...

  9. ajax一些东西

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  10. Bulk API

    承接上文,使用Java High Level REST Client操作elasticsearch Bulk API 高级客户端提供了批量处理器以协助批量请求 Bulk Request BulkReq ...