《Spring源码深度解析》学习笔记-容器的功能扩展
ApplicationContext接口用于扩展BeanFactory中现有的功能,二者都用于加载bean,
ApplicationContext包含BeanFactory所有的功能,通常建议比BeanFactory优先使用。
二者写法上的差异:
BeanFactory加载XML:
BeanFactory bf=new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
ApplicationContext加载XML:
ApplicationContext bf= new ClassPathXmlApplicationContext("beanFactoryTest.xml");
以ClassPathXmlApplicationContext为切入点,代码如下:

1.设置配置路径

2.扩展功能

3.环境准备

4.加载BeanFactory



5.功能扩展
1)增加SPEL语言的支持(Spring Expression Language )
SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用
SpEL使用#{...}作为定界符
2)增加属性注册编辑器
Spring DI注入的时候可以把普通属性注入进来,但是像Date类型就无法被识别,对此Spring提供两种解决办法
A. 使用自定义属性编辑器,通过继承PropertyEditorSupport,重写setAsText方法
B. 注册Spring自带的属性编辑器CustomDateEditor
3)添加ApplicationContextAwareProcessor处理器
4)设置忽略依赖
5)注册依赖
6.BeanFactory的后处理
BeanFactory作为Spring中容器功能的基础,用于存放所有已经加载的bean
1)激活注册的BeanFactoryPostProcessor:BeanFactoryPostProcessor接口和BeanPostProcessor类似,
可以对bean的定义进行处理。
2)注册BeanPostProcessor
3)初始化消息资源:国际化
4)初始化ApplicationEventMulticaster
5)注册监听器
7.初始化非延迟加载单例
完成BeanFactory的初始化工作,其中包括ConversionService的设置、配置冻结以及非延迟加载的bean的初始化工作

8.finishRefresh
initLifecycleProcessor 初始化-->onRefresh 启动-->publishEvent 保证监听器进一步处理
注意:
惰性加载又称延迟加载、懒加载、无限滚动、瀑布流....
单实例(惰性/延迟加载):只有当使用到这个实例的时候才会创建这个实例
-------------------------------------------------
|public class Singleton{ |
| private static Singleton instance = null; |
| private Singleton(){ |
| … |
| } |
| public static Singleton getInstance(){ |
| if (instance == null) |
| instance = new Singleton(); |
| return instance; |
| } |
|} |
--------------------------------------------------

浙公网安备 33010602011771号