IOC类图结构
在这里插入图片描述
各个接口的作用

接口名说明
BeanFactory定义了基本IOC容器的规范,包含像getBean()这样的IOC容器的基本方法
HierarchicalBeanFactory增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IOC接口的关联功能
ConfigurableBeanFactory主要定义了对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器,等等。
AutowireCapableFactory这个工厂接口继承自BeanFacotory,它扩展了自动装配的功能,根据类定义BeanDefinition装配Bean、执行前、后处理器等
ListableBeanFactory可以列出工厂可以生产的所有实例。当然,工厂并没有直接提供返回所有实例的方法
MessageSource提供国际化的消息访问
ResourceLoader资源加载的功能
ApplicationContext核心接口
ApplicationEventPublisher功能就是发布事件,也就是把某个事件告诉的所有与这个事件相关的监听器
ConfigurableApplicationContext提供设置活动和默认配置文件以及操作底层属性源的工具
WebApplicationContext提供了Web环境的支持
ThemeSource主题资源

BeanFactory和ApplicationContext的区别
BeanFactory是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
ApplicationContext接口是由BeanFactory接口派生而来,因而具有BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能
1.MessageSource, 提供国际化的消息访问
2.资源访问,如URL和文件
3.事件传播
4.载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

在这里插入图片描述
Spring的启动流程
Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
1.1 xml注册bean;
1.2 注解注册Bean;@Service、@Component、@Bean、xxx
Spring容器会合适的时机创建这些Bean
2.1用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
2.2统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
后置处理器;BeanPostProcessor
每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
事件驱动模型;
ApplicationListener;事件监听;
ApplicationEventMulticaster;事件派发:
在这里插入图片描述
在这里插入图片描述

参数
configLocation·applicationContext.xml
parentnull
refreshtrue

setConfigLocations(configLocations)
1.setConfigLocations主要工作有两个:创建环境对象ConfigurableEnvironment 、处理ClassPathXmlApplicationContext传入的字符串中的占位符;
2. 环境对象ConfigurableEnvironment中包含了当前JVM的profile配置信息、环境变量、 Java进程变量;
3. 处理占位符的关键是ConfigurableEnvironment、PropertyResolver、PropertyPlaceholderHelper之间的配合

在这里插入图片描述
refresh()

@Override
public void refresh() throws BeansException, IllegalStateException {
    //startupShutdownMonitor对象在spring环境刷新和销毁的时候都会用到,确保刷新和销毁不会同时执行
    synchronized (this.startupShutdownMonitor) {
        // 准备工作,例如记录事件,设置标志,检查环境变量等,并有留给子类扩展的位置,用来将属性加入到applicationContext中
        prepareRefresh();

        // 创建beanFactory,这个对象作为applicationContext的成员变量,可以被applicationContext拿来用,
        // 并且解析资源(例如xml文件),取得bean的定义,放在beanFactory中
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // 对beanFactory做一些设置,例如类加载器、spel解析器、指定bean的某些类型的成员变量对应某些对象等
        prepareBeanFactory(beanFactory);

        try {
            // 子类扩展用,可以设置bean的后置处理器(bean在实例化之后这些后置处理器会执行)
            postProcessBeanFactory(beanFactory);

            // 执行beanFactory后置处理器(有别于bean后置处理器处理bean实例,beanFactory后置处理器处理bean定义)
            invokeBeanFactoryPostProcessors(beanFactory);

            // 将所有的bean的后置处理器排好序,但不会马上用,bean实例化之后会用到
            registerBeanPostProcessors(beanFactory);

            // 初始化国际化服务
            initMessageSource();

            // 创建事件广播器
            initApplicationEventMulticaster();

            // 空方法,留给子类自己实现的,在实例化bean之前做一些ApplicationContext相关的操作
            onRefresh();

            // 注册一部分特殊的事件监听器,剩下的只是准备好名字,留待bean实例化完成后再注册
            registerListeners();

            // 单例模式的bean的实例化、成员变量注入、初始化等工作都在此完成
            finishBeanFactoryInitialization(beanFactory);

            // applicationContext刷新完成后的处理,例如生命周期监听器的回调,广播通知等
            finishRefresh();
        }

        catch (BeansException ex) {
            logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);

            // 刷新失败后的处理,主要是将一些保存环境信息的集合做清理
            destroyBeans();

            // applicationContext是否已经激活的标志,设置为false
            cancelRefresh(ex);

            // Propagate exception to caller.
            throw ex;
        }
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐