首先Java对象和Spring所管理的Bean实例化过程不同
在Java中
1).java文件被编译成.class文件
2)等到类需要被初始化时(new,反射).calss文件被虚拟机通过类加载器加载
3)初始化对象供我们使用
在Spring中
会用BeanDefinition的实例来描述对象的信息
Bean的加载过程
1.注册BeanFactory后置处理器
2.通过BeanFactory后置处理器扫描出所有需要spring管理的类
3.通过BeanFactory后置处理器封装成BeanDefinition加载到BeanFactory
4.创建非延迟加载的bean实例
Bean被加载后的实例化过程
执行实例化前操作
创建Bean实例
将Bean缓存起来(缓存到三级缓存中,二级缓存中有代理模式)
给Bean填充属性值
初始化Bean
(1) 执行BeanPostProcessor-postProcessBeforeInitialization(2) 执行InitializingBean->afterPropertiesSet(3) 执行initMethod(4) 执行BeanPostProcessor-postProcessAfterInitialization
spring是如何解决属性循环依赖的
其中用到了缓存
而这个缓存再具体的话就是三级的缓存
Bean实例化的过程如上,第三步缓存bean就是为了解决循环依赖的,例如:A与B属性循环依赖。
A执行第二,三步,调用构造函数并将实例加入缓存;
A执行第四步时找不到B实例,于是先去执行B的实例化;
B执行到第4步时从缓存中能够找到A实例,于是B实例化成功;
接着再执行A的实例化。
Bean的生命周期
1.BeanDefined
2.BeanFactoryPostProcessor对BeanDefined后置处理
3.InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation实例化前执行
4.Bean实例化
5.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation实例化后执行
6.属性注入
7.BeanNameAware.setBeanName
8.BeanFactoryAware.setBeanFactory
9.ApplicationContextAware.setApplicationContext
10.BeanPostProcessor的前置方法
11.InitializingBean.afterPropertiesSet方法
12.@PostConstruct修饰的方法
13.BeanPostProcessor的后置操作
14.DisposableBean.destory销毁