从AbstractAutowireCapableBeanFactory
类中的doCreateBean
方法开始
-
创建Bean的实例
主要由createBeanInstance()
实现,该方法返回一个BeanWrapper
对象。BeanWrapper
对象是 Spring 的一个低级 Bean 基础结构的核心接口,这个时候的Bean 还不能够被我们使用,连最基本的属性都没有设置。而且在我们实际开发过程中一般都不会直接使用该类,而是通过 BeanFactory 隐式使用。
BeanWrapper
接口有一个默认实现类BeanWrapperImpl
,其主要作用是对Bean
进行“包装”,然后对这个包装的 bean 进行操作,比如后续注入 bean 属性。
在实例化 bean 过程中,Spring 采用“策略模式”来决定采用哪种方式来实例化 bean,一般有反射和 CGLIB 动态字节码两种方式。默认是CGLIBprivate InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
-
填充Bean中的属性
使用属性值填充给定BeanWrapper
中的bean实例.主要是调用AbstractAutowireCapableBeanFactory
中populateBean
方法 -
初始化bean
初始化给定的bean实例,调用init方法和bean后置处理器,主要调用的是AbstractAutowireCapableBeanFactory
中initializeBean
方法- 调用
AbstractAutowireCapableBeanFactory
中的invokeAwareMethods
方法,检查Bean是否实现了Aware
的接口,如果实现了BeanNameAware
方法,则会调用bean的setBeanName
将beanName传入Bean中;如果实现了BeanClassLoaderAware
则会调用bean的setBeanClassLoader
将加载该类的ClassLoader传入Bean中;如果实现了BeanFactoryAware
,则会调用bean的setBeanFactory
将BeanFactory传入Bean中. - 如果存在
BeanPostProcessor
(容器内共享且先初始化)后置处理器,则先调用postProcessBeforeInitialization
方法.这里会依次调用容器中存在的所有后置处理器实例的该方法 - 调用
AbstractAutowireCapableBeanFactory
中的invokeInitMethods
方法.如果实现了InitializingBean
接口,则会调用bean的afterPropertiesSet
方法(此方法的目的是在bean的所有属性后,这个方法允许Bean实例执行对它整体属性的验证和最终初始化);如果指定了init-method
方法,则利用反射机制调用该指定方法,该方法不能有参数 - 如果存在
BeanPostProcessor
(容器内共享且先初始化)后置处理器,则会调用postProcessAfterInitialization
方法.这里会依次调用容器中存在的所有后置处理器实例的该方法. - 这些过程都完成后,就可以再Spring容器中使用了.
- 调用
-
使用
在容器中通过ApplicationContext
中的getBean
方法获取bean实例并使用 -
销毁
如果调用了ClassPathXmlApplicationContext
的close
方法后,会在调用BeanFactory
的destroySingletons
方法销毁bean- 如果该 bean 实现了
DisposableBean
接口,则调用bean的destroy()
方法。 - 如果该 bean 配置了
destroy-mehod
,则调用其指定的方法。
- 如果该 bean 实现了
注意:
BeanPostProcessor
:bean的后置处理器,ApplicationContext
中共享.
在ApplicationContext context = new ClassPathXmlApplicationContext(BEAN_XML, getClass());
调用时,会调用PostProcessorRegistrationDelegate
类的registerBeanPostProcessors
方法注册后置处理器.然后再创建其他未指定延迟加载的普通bean
这里需要注意的是:需要使用BeanPostProcessor
的bean一定不要实现BeanPostProcessor
接口,否则在根据配置文件生成ApplicationContext
时会当作是后置处理器注册,并且这里的逻辑是先实例化所有的自定义的BeanPostProcessor
后才统一调用registerBeanPostProcessors(beanFactory, orderedPostProcessors)
方法进行注册,所以实现了BeanPostProcessor
接口的bean不会再调用的BeanPostProcessor
中的前后置方法.因此,后置处理器应当单独编写
如有错误或遗漏之处烦请指正,谢谢~~~