个人学习笔记
7、finishBeanFactoryInitialization(beanFactory);初始化完成剩下的所有单实例bean
1、获取到所有的bean实例RootBeanDefinition
2、判断if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
1、如果通过判断是否为FactoryBean
2、不是工厂bean,利用getBean(beanName);创建对象
1、doGetBean(name, null, null, false);
2、先通过getSingleton(beanName);获取已经缓存的单实例bean
所有创建的bean都缓存到Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
3、缓存中获取不到,开始bean的创建对象流程
4、markBeanAsCreated(beanName);标记bean已经被创建
5、获取bean的定义信息
6、String[] dependsOn = mbd.getDependsOn();获取bean的其他依赖bean
,如果有,则先创建依赖bean
7、启动单实例bean的创建流程:
1、createBean(beanName, mbd, args);
2、resolveBeforeInstantiation(beanName, mbdToUse);在创建bean之前,希望返回一个代理bean
【InstantiationAwareBeanPostProcessors】
先触发applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
如果有返回值则触发applyBeanPostProcessorsAfterInitialization(bean, beanName);
3、如果没有返回代理bean,则调用doCreateBean(beanName, mbdToUse, args);创建bean 实例
4、bean属性赋值:populateBean(beanName, mbd, instanceWrapper);
赋值之前:
1、拿到InstantiationAwareBeanPostProcessor后置处理器
执行postProcessAfterInstantiation()
2、InstantiationAwareBeanPostProcessor后置处理器
执行postProcessPropertyValues()
3、利用反射,用setting 给属性赋值
applyPropertyValues(beanName, mbd, bw, pvs);
5、bean的初始化initializeBean();
1、执行aware接口方法invokeAwareMethods(beanName, bean);
1、如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
2、如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
3、如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。
2、执行后置处理器初始化之前applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor.postProcessBeforeInitialization(result, beanName);
3、执行初始化方法invokeInitMethods(beanName, wrappedBean, mbd);
1、是否是InitializingBean接口的实现,执行接口规定的初始化
2、是否自定义初始化
4、执行后置处理器初始化之后applyBeanPostProcessorsAfterInitialization()
BeanPostProcessor.postProcessAfterInitialization(result, beanName);
6、执行bean的销魂方法
8、将创建好的bean放到缓存中addSingleton(beanName, singletonObject);
8、finishRefresh(); 完成BeanFactory的初始化创建工作
1、initLifecycleProcessor();初始化和生命周期有关的处理器LifecycleProcessor
写一个LifecycleProcessor的实现类,重写
onRefresh();
onClose();
2、getLifecycleProcessor().onRefresh();
拿到前面定义的生命周期处理器,回调onRefresh()
3、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件
4、LiveBeansView.registerApplicationContext(this);
Spring Bean 的生命周期
-
Bean容器找到配置文件中Spring Bean的定义
-
Bean容器利用反射创建一个Bean的实例
-
如果涉及到一些属性值,利用set()方法设置一些属性值
-
如果Bean实现了BeanNameAware接口,调用setBeanName方法,传入Bean的名字
-
如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader,传入ClassLoader对象的实例
-
如果Bean实现了BeanFactoryAware接口,调用setBeanFactory,传入AbstractAutowireCapableBeanFactory
-
调用BeanPostProcessor对象,执行postProcessBeforeInitialization
-
如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
-
如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
-
如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。
-
当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
-
当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。