美文网首页
Spring 源码(一)Spring 容器的入口

Spring 源码(一)Spring 容器的入口

作者: xiaolyuh | 来源:发表于2019-09-29 12:49 被阅读0次

    Spring 容器的初始化

    ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    

    当我们完成一个ApplicationContext的实例化时就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的构造方法也就是Spring容器的入口。

    // 初始化容器
    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        // 注册 Spring 内置后置处理器的 BeanDefinition 到容器
        this();
        // 注册配置类 BeanDefinition 到容器
        register(annotatedClasses);
        // 加载或者刷新容器中的Bean
        refresh();
    }
    

    这个构造方法只有三行:

    1. 注册内置的BeanPostProcessor的BeanDefinition到容器
    2. 注册配置类 BeanDefinition 到容器
    3. 加载或者刷新容器中的Bean

    容器的初始化过程我认为大致分为:

    1. 注册内置的BeanPostProcessor的BeanDefinition到容器
    2. 注册配置类 BeanDefinition 到容器
    3. 解析配置类
    4. 初始化所有单例Bean,并注册到容器

    AnnotationConfigApplicationContext 总揽

    我们来看下AnnotationConfigApplicationContext的类图:


    AnnotationConfigApplicationContext.png
    • BeanFactory:它定义了Spring IOC容器最基本的功能规范,主要用来实例化、配置和管理Bean,它是IOC容器容器的心胀。
    • HierarchicalBeanFactory:继承BeanFactory接口,新增了getParentBeanFactory()方法,使BeanFactory具备了双亲IOC容器的管理功能。
    • ListableBeanFactory:细化了许多BeanFactory接口的功能,比如getBeanDefinitionNames()方法(获取容器中所有Bean定义的名称)。
    • ResourceLoader:资源加载器。
    • MessageSource:支持不同的信息源,从而实现国际化。
    • ApplicationEventPublisher:支持应用事件,提供事件机制的定义。
    • EnvironmentCapable:提供了对环境变量的支持。
    • ApplicationContext:它继承了上述所有接口,是IOC容器的高级形态,它定了一个完成容器的雏形。
    • AbstractApplicationContext:一个容器的抽象实现。

    用户使用容器时,可以使用转义符"&"来得到FactoryBean本身,如果不加则是获取FactoryBean产生的对象。

    BeanFactory和FactoryBean的区别

    • BeanFactory:它是对IOC容器所有Bean进行管理,如实例化,配置和获取容器中的Bean。
    • FactoryBean:它是一个能够生产或者修饰对象生成的工厂Bean。

    BeanFactory和ApplicationContext的区别

    • BeanFactory是容器的基本定义。
    • ApplicationContext继承自BeanFactory,是容器的高级形态,在BeanFactory的基础上添加了许多对高级容器特性的支持。

    相关文章

      网友评论

          本文标题:Spring 源码(一)Spring 容器的入口

          本文链接:https://www.haomeiwen.com/subject/qjisyctx.html