spring的核心内容便是IOC(Inversion Of Control, 不过有人觉得叫Dependency Injection 更贴切)
:
BeanFactory: spring Bean 容器最顶层的接口,主要定义了基本的Bean获取操作。其子类必须尽可能的支持SpringBean对象的生命周期,它的顺序如下(只是先后顺序,可以跳过):
1. BeanNameAware's setBeanName
2. BeanClassLoaderAware's setBeanClassLoader
3. BeanFactoryAware's setBeanFactory
4. ResourceLoaderAware's setResourceLoader
(only applicable when running in an application context:这句话的意思是只有ApplicationContext的子类才有意义)
5. ApplicationEventPublisherAware's setApplicationEventPublisher
(only applicable when running in an application context)
6. MessageSourceAware's setMessageSource
(only applicable when running in an application context)
7. ApplicationContextAware's setApplicationContext
(only applicable when running in an application context)
8. ServletContextAware's setServletContext
(only applicable when running in a web application context)
9. postProcessBeforeInitialization
methods of BeanPostProcessors
10. InitializingBean's afterPropertiesSet
11. a custom init-method definition
12. postProcessAfterInitialization
methods of BeanPostProcessors
On shutdown of a bean factory, the following lifecycle methods apply:
1. DisposableBean's destroy
2. a custom destroy-method definition
HierarchicalBeanFactory:相比BeanFactory 其多了父子层级关系。
ListableBeanFactory:顾名思义,此BeanFactory是可以把容器中的bean循环枚举出来,而不是按照名字一个一个去取。
AutowireCapableBeanFactory:自动注入的BeanFactory,官方API中说明ApplicationContext并没有实现此接口(可以通过@link org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()获取)
ConfigurableBeanFactory:这是BeanFactory的扩展接口,只是为了内部方便使用以及获取BeanFacotry的配置信息(建议还是用BeanFacoty或者ListableBeanFactory)
BeanDefinitionRegistry:在spring中BeanFactory想要初始化一个Bean是根据BeanDefinition来操作的,所以这个类主要定义了通过BeanDefinition注册Bean、获取Bean、销毁Bean
XmlBeanFactory:这个类定义了spring bean配置文件的格式是xml的,他主要是通过xmlReader去构造Bean。
XmlBeanFactory大致初始化顺序:
得到XML文件的Resource(统一资源处理接口) --> 解析XML文件(如果有import直接递归解析) --> 解析成BeanDefinition并注册到Container中(从图中可以看到, XmlReader中聚合了一个BeanDefinitionRegister,所以解析后的beanDefinition直接注册到BeanFactory中)
初始化结束,也就是说,这个XmlBeanFactory只干了一个读取xml并将xml的内容转换成BeanDefinition,注册到容器里面。这个时候,Spring的Bean还没有初始化。
当调用getBean系列方法时,Bean开始初始化,进入Bean初始化流程。