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

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

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

  

 

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

 

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

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

 

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

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

  下面来大概看看源码:继承

 

9.OnRefrsh教程

  这又是一个空方法,加入咱们继承本类(子容器),让咱们在容器刷新的时候,能够自定义一些操做。接口

 

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

 

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

 

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

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

 

 

  

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

 

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

  

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

 

  进入doCreatBean方法,

 

  继续进入createBeanInstance,

 

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

 

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

 

 

  打开populateBean方法(注意:先拿到全部的属性值,而后执行了两个后置处理器以后,再进行赋值

 

 

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

 

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

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

 

  

  进入初始化Bean方法

  并且能够进去看看有哪些xxxAware接口

 

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

   下面咱们还能够看看要执行哪些后置处理器

  

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

  

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

 

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

 

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

 

  

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

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

相关文章
相关标签/搜索