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

时间:2021-08-05 02:57:52

  继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了)

6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory))

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

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

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

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

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

  最后一步,添加一个后置处理器,打开这个后置处理器

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

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

7.initMessageSource();(主要是做国际化功能,消息绑定,emmm...不怎么了解这个)

  大概的意思就是先判断容器里有没有一个id=messageSource,类型为MessageSource的组件(用于解析国际化的配置文件),有的话直接用(就是去拿国际化配置文件的信息),没有的话就new 一个DelegatingMessageSource(),丢到容器里面,然后再接着用.....反正我对这个不怎么了解,有兴趣的小伙伴可以自己去看看别的教程或者自己去走走源码。我就跳过了。

8.初始化事件派发器(initApplicationEventMulticaster();)

  最好和下面的注册监听器一起看,在我以前发过知识小罐头的那个文章里大概说了一下事件派发器的原理,就是事件派发器会自动的收集所有的监听器,容器只需要发布消息,事件派发器就会将事件派发给所有监听器,让监听器都去执行。

  下面来大概看看源码:

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

9.OnRefrsh

  这又是一个空方法,加入我们继承本类(子容器),让我们在容器刷新的时候,可以自定义一些操作。

10.注册监听器(registerListeners();)

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

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

  至于怎么获取事件派发器,和怎么派发事件,这个很容易,自己点进去看看就ok了(也可以自己实现一个监听器,放到容器里,然后调试,可能看的更清楚点)

11.完成BeanFactory的初始化(finishBeanFactoryInitialization(beanFactory);)

  这里是重点:有没有前面都是为BeanFactory做的一些默认工作,往里面添加一些什么组件,监听器,消息派发器什么的,一直到这里,就是对其他的单实例Bean(是单实例,因为我们在往容器里添加我们定义的bean的时候,可以设置多例或者懒加载,单例的话实例化一次,然后给你丢缓存里,多例和懒加载是要在每次用的时候才去给你实例化一个)

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

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

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

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

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

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

  

  然后再进去doGetBean(单实例的Bean,只要创建过就会缓存起来)

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

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

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

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

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

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

  接着进入resolveBeforeInstantiation方法,下图的两个方法可以点进去自己看看(就是执行InstantiationAwareBeanPostProcessor里面的方法),很有意思。其实用注解开启事务跟这个有关。

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

  

  上面是如果能返回代理对象的,假如不能返回代理对象的话,

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

  进入doCreatBean方法,

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

  继续进入createBeanInstance,

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

  实例创建完了,然后返回,再执行后置处理器的方法

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

  继续往下走(这里就是相当于核心了),两步,赋值,初始化

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

  打开populateBean方法(注意:先拿到所有的属性值,然后执行了两个后置处理器之后,再进行赋值)

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

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

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

  一直到populateBean方法的最后,才赋值(其实就是调用一些setXXX方法)

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

---------------------------------------------------------------------------------------------------------------------

  赋值结束,下面进行初始化

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

  

  进入初始化Bean方法

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

  而且可以进去看看有哪些xxxAware接口

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

  继续往下看,执行初始化方法前后,都要执行bean后置处理器(BeanPostProcessor)的xxxBeforexxx,xxxAfterxxx的方法

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

  下面我们还可以看看要执行哪些后置处理器

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

  

  ok,初始化方法前后的操作都知道了,现在看看初始化方法内部了(还记不记得怎么设置初始化方法啊第一种:实现InitializingBean接口和DisposableBean接口;第二种:@Bean(initMethod=“初始化方法名” destroyMethod=“销毁方法名”;其他的的方法记不清了,嘿嘿...))

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

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

  

  到这里单实例Bean就创建出来了,返回出去

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

  继续往下走,注册实现了Disposable接口的bean

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

  到这里,单实例Bean就创建完了,然后就把这创建完的单实例bean放到缓存里去(其实我看了,就是一个map)

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

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

  

  到这里,这一节就结束了,ioc说的差不多了,还有一小步,下一节收尾就ok了。

  而且,能看到最后的小伙伴,有没有发现,其实ioc容器本质上就是很多的map,map里面放了很多的组件,我们要用这些组件就是从这么多map里面去拿,所以不要把ioc容器想的太难了(咳咳,虽然我也很菜,ioc对新人确实有点难),多走走源码,其实还是挺有感觉的。哈哈哈@_@

  

带着萌新看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源码8(spring ioc源码上)

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

  5. 带着萌新看springboot源码03

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

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

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

  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. FZU 2127 养鸡场

     Problem Description Jason买来了n米长的竹篱笆,打算将n米长的竹篱笆全部用来围成一个三角形的养鸡场.为方便起见,养鸡场三条边的长度都为正整数.同时,他想让自己的养鸡场看起来更 ...

  2. Mysql - 解决Access denied for user ''@'localhost' to database 'mysql'问题

    http://361324767.blog.163.com/blog/static/11490252520124454042468/ 首先我想说一句话: 我极度鄙视国内搞IT的人,简直无语,同样是解决 ...

  3. PHP中检测ajax请求的代码例子

    多数情况下,基于JavaScript 的Js框架如jquery.Mootools.Prototype等,在发出Ajax请求指令时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息, ...

  4. [非技术参考]C# Socket网络编程

    我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: 1. TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一 ...

  5. 599. Minimum Index Sum of Two Lists

    Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite ...

  6. limit实现的分页查询

    背景:原先是一次性查询加载到前段,表格插件自动分页,最近查询的数据量越来越大,长的时候需要等好几十秒,决定自己写一个后端分页,我写的和网上大神的略有不同,不是后端写一个类封装分页的参数,每次查询都是穿 ...

  7. MySQL yum 在线与本地包方式安装

     以下实践操作是在 liux-centos7 上安装配置 先检测是否安装mysql,然后在拆卸mysql # 检测[root@localhost ~]# yum list installed | gr ...

  8. 【API】检查进程是否存在 - CreateToolhelp32Snapshot

    1 学习目标 今天静态逆向mydocument病毒时,看到病毒代码为了防止自身被调试会先检测杀毒软件和调试工具的进程是否存在.如果没有杀毒软件则释放真正的病毒文件,提前熟悉一下枚举进程的反汇编代码. ...

  9. JMeter:生成漂亮的接口/压力测试的HTML报告

    JMeter生成HTML网页报告(非gui模式操作) 我们做性能测试的时候会经常使用一些性能测试工具,比如loardrunner和jmeter,我个人比较喜欢Jmeter这个工具,jmeter之前版本 ...

  10. IoT固/软件更新及开源选项

    会出什么问题呢?大多数这些设备的设计都不像是被恶意攻击的目标. 嵌入式系统传统上被认为是稳定的产品, 但实施起来成本高昂, 因为投资回报率(ROI)在的周期比较长. 在过去一旦发货, 就很少需要更新这 ...