1.Spring Context容器
Spring中的核心是IOC和AOP.在内部都是需要依托于容器的.
(1) 容器的基本实现 -- BeanFactory,ApplicaitonContext
(2) Bean是怎么表示的 -- BeanDefinition
(3) Bean如何进行解析 -- 资源定位,加载,解析,注册
1.1 容器核心类介绍
1. DefaultListableBeanFactory
Spring内部最基本的类,是Spring注册和加载的bean的默认实现. 内部使用的就是该容器类.
Map<String,BeanDefinition> beanDefinitionMap -- 用于存储解析结果,Spring内部以BeanDefinition类保存配置信息
2. Resource
Resource接口抽象了所有Spring内部使用的底层资源.对不同的来源有相应的Resource表示.
FileSystemResource / ClassPathResource / URLResource / InputStreamResource
3. EntityResolver
提供一个如何寻找DTD声明的方法,既可以读取在存储在项目中的DTD文件,避免通过网络的方式下载.
4. AbstractBeanDefinition类
BeanDefinition的通用属性定义.Xml中bean的定义均可以在该类中找到对应的属性.
重要属性: scope, lazy-init, autowireMode, autowireCandidate, primary, factoryMethodName, initMethodName
1.2 xml配置文件的加载过程
(1) 通过ResourceLoader将xml文件加载为Resource对象
(2) 通过DocumentLoader将Resource对象以Document的形式加载到内存
(3) 通过BeanDefinitionDocumentReader对Document对象进行解析
(4) 最后注册到BeanDefinitionRegistry中
解析标签是最关键的步骤. 标签分为默认标签和自定义标签.
1.2.1 自定义标签有4中类别. 1. import 2.bean 3. alias 4.beans
1.2.2 自定义标签的解析,需要实现BeanDefinitionParser和NamespaceHandlerSupprt接口
1.3 初始化BeanFactory
入口为: AbstractApplicationContext --> refresh()
(1) finishBeanFactoryInitialization 实例化非懒加载的单例,以下为具体操作
1. getBean
==》2.doGetBean
==》3. 按照Scope调用createBean (1)resolveBeanClass (2)prepareMethodOverrides
(3)resolveBeforeInstantiation 执行InstantiationAwareBeanPostProcessor的BeanPostProcessorsBeforeInstantiation方法,如果返回bean则不进行接下来的初始化过程
==》4. doCreateBean (1)创建bean对象,包装为BeanWrapper (2)applyMergedBeanDefinitionPostProcessors 执行applyMergedBeanDefinitionPostProcessors后置处理器,获取依赖注入(@Component)的属性
==》4.1 populateBean (1)postProcessAfterInstantiation (2)autowireByName / autowireByType (3)postProcessPropertyValues 实现@Autowired标注属性的依赖注入(4)applyPropertyValues -- 真正依赖注入的代码
==》4.2 initializeBean(1)invokeAwareMethods (2)applyBeanPostProcessorsBeforeInitialization -- @PostConstruct的调用(3)invokeInitMethods -- 分为afterPropertiesSet和invokeCustomInitMethod(4)applyBeanPostProcessorsAfterInitialization(实现代理)