1.跟普通的对象不一样。传统的对象创建有几个步骤
- 编译为class文件
- 等类需要初始化的时候加载到JVM里面,如遇到new 反射(主动引用)
- 初始化供我们使用
而BeanDefinition还有不同的点就是,还增加了一些对Bean对象的描述信息,比如@Scorpe,@Lazy
2.Bean在启动的时候会扫描在XML、注解中需要被Bean管理的信息,并把它们封装在一个beanDefinitionMap中,这个Map的key是beanName, Value是BeanDefinition对象,到这里其实是把定义的元数据加载起来。真实的对象还没有实例化。
1 | 3.接下来会遍历这个Map,执行一个BeanFactoryPostProcessor的工厂后置处理器。比如说我们的占位符信息,就是在这一步进行注入的。 |
4.下一步就是实例化对象了,Spring里是采用反射,选择合适的构造器把对象实例化,但此时的对象具体的属性还没有注入。
5.下一步是注入属性。
6.注入完了开始初始化的工作。就首先判断Bean是否实现了Aware相关的接口,实现了就填充相关的资源。
7.接口处理完就到了BeanPostProcessor的后置处理器,主要有两个方法,一个是Before, 一个是After。
8.这个后置处理器也是AOP实现的关键。
执行Before
随后执行init相关的方法,比如PostConstruct,实现InitializingBean接口,定义的init-method方法
执行After
9.随后如果要销毁的话就查看有没有配置相关的destroy方法。
属性的注入在构造器执行完之后。三级缓存,三个Map。
singletonObjects(一级,日常获取Bean的地方)
earlySingletonObjects(二级,已实例化,还没有属性注入,由三级缓存放进来 Value就是Bean)
singletonFactories(三级,Value是一个对象工厂)
A实例完后,属性注入前会先把自己放入三级缓存。Key是BeanName, Value是ObjectFactory
B发现自己依赖A,会去三级缓存找,找到后把A提升到二级缓存,自身顺利初始化。
A顺利会把自身给提升到一级缓存。
为什么是三级
因为当A是一个被AOP增强的对象时。在使用了三级缓存的情况下为A创建代理的时机是在B中需要注入A的时候,因为Value值是一个objectFactory.而不使用三级缓存的话在A实例化后就需要马上为A创建代理然后放入到二级缓存中去。
关键源码方法(强烈建议自己去撸一遍)
org.springframework.context.support.AbstractApplicationContext#refresh
(入口)org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
(初始化单例对象入口)org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons
(初始化单例对象入口)org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
(万恶之源,获取并创建Bean的入口)org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
(实际的获取并创建Bean的实现)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)
(从缓存中尝试获取)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
(实例化Bean)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
(实例化Bean具体实现)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
(具体实例化过程)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory
(将实例化后的Bean添加到三级缓存)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
(实例化后属性注入)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
(初始化入口)
去网上看博客的时候,找到了几张比较好的图,这里贴下方便大家理解吧~