《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为切入点,代码如下:

    《Spring源码深度解析》学习笔记-容器的功能扩展_第1张图片
    1.设置配置路径
    《Spring源码深度解析》学习笔记-容器的功能扩展_第2张图片
    2.扩展功能
    《Spring源码深度解析》学习笔记-容器的功能扩展_第3张图片
    3.环境准备
    《Spring源码深度解析》学习笔记-容器的功能扩展_第4张图片
    4.加载BeanFactory
    《Spring源码深度解析》学习笔记-容器的功能扩展_第5张图片
    《Spring源码深度解析》学习笔记-容器的功能扩展_第6张图片

《Spring源码深度解析》学习笔记-容器的功能扩展_第7张图片

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的初始化工作
        《Spring源码深度解析》学习笔记-容器的功能扩展_第8张图片
        
    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;                        |
        |    }                                           |
        |}                                               |
        --------------------------------------------------

你可能感兴趣的:(Spring)