本文持续更新中
有时候在想一个问题:如果一个Java开发仅仅会用某个框架(当然最典型的是Spring),那么随着工作经验、年龄的增加,很难继续留在这个行业。每年都有应届生涌入这个行业,如果一个人的工龄、年龄不断增加,但是技术实力和一个应届生之间没有太大的距离,那么势必会被淘汰掉,这是事物发展的规律。
说到Spring bean,其实不要上来就聊生命周期、启动流程之类的。我们应该进口Spring的两大核心IOC和AOP。这里不会解释什么是IOC或者AOP,这两个概念应该是最最最基础的概念(思想)。这两种思想在Spring中的体现都离不开Spring bean:其实Spring的很多概念都可以围绕Spring bean来加深理解。
对于Spring bean,可以把他做一个特殊的对象。只不过这个对象是Spring为我们进行管理--这是这个框架强大的功能体现。既然谈到了管理,那么就离不开生命周期:
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction

最重要的是前三个周期。至于启动流程,其实都是围绕springbean展开的,穿插在以上四个生命周期的前后,实现对bean的全方位管理。
然后带着设计的思维再往源码角度理解,如果不带着设计思维,很容易陷入细节的沼泽,到最后看的昏昏欲睡~
实例化:
为什么说这个生命周期很重要,这里就要深入到源码来加深理解,AbstractApplicationContext类中有个非常重要的方法refresh(),这个方法看着一堆流程(当然都有注释,不得不佩服作者的好习惯!),其实只需要先留意这个方法(实例化):
arduino
// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);
管理bean,自然的离不开方法(method)。围绕以上四个阶段,延申出来了两种类型的方法:bean自身的方法和容器级的方法(这里的主要是PostProcessor)。其中容器级别的方法是属于容器的,独立于bean,并且创建每一个bean的过程中,都会启动作用。bean级的生命周期方法,主要是又aware。尤其针对于实例化前后、初始化前后,都有比较重要的后置处理器来进行额外的拓展性增强处理。
如果再细致下,bean级别的这里又分为自身的、拓展的(拓展的意思是该bean实现了特定的接口,这里我自己理解为是拓展的)。容器级别的主要是一堆post处理器;bean级别的有例如get set 构造方法等等,当然这是内部的,拓展出来的呢又有其他的,比较具有代表的就是ware(感知)接口,aware这类接口众多,想记住全部不太现实,其实我们只要理解了这类的作用就好。通常经常遇到beannameaware beanfactoryaware xxware接口等等,这些主要的作用是可以拿到xx资源,增加了灵活性,其实就是面向接口编程的重要体现。