美文网首页
Day63 Spring 启动过程解析

Day63 Spring 启动过程解析

作者: 小周爱吃瓜 | 来源:发表于2022-07-03 13:25 被阅读0次

创建BeanFactory -- DefaultListableBeanFactory

注册,然后setXXX

addBeanDefinitionXXX ---> 存放到 BeanFactoy中

addBeanPostProcessor.

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
        this();
        register(componentClasses);
        refresh();
    }

调用构造,注册实例,刷新容器。

  1. 准备刷新 prepareRefresh();
    可以记录启动时间,允许子类添加内容到容器里面
  2. 构建BeanFactory 做初始化操作
  3. 构建BeanFactoryProcessor
  4. onRefresh方法 空实现
  5. 完成刷新,完成初始化,然后发送初始化完成推送

BeanFactory对象

调用无参构造,创建一个DefaultListableBeanFactory.

构建BeanFactory对象(DefaultListableBeanFactory)解析后得到BeanDefinition,注册到BeanFactory中。

解析@ComponentScan,Import,Bean注解 .

ApplicationContext需要支持国家化,事件机制,所以还需要初始化Msg,ApplicationEventMulCa. ApplicationListener对象添加到ApplicationContext中,启动完毕后发布事件.

  • Multicaster,Event,国际化资源
protected void registerListeners() {
        // Register statically specified listeners first.
        for (ApplicationListener<?> listener : getApplicationListeners()) {
            getApplicationEventMulticaster().addApplicationListener(listener);
        }

        // Do not initialize FactoryBeans here: We need to leave all regular beans
        // uninitialized to let post-processors apply to them!
        String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
        for (String listenerBeanName : listenerBeanNames) {
            getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
        }

        // Publish early application events now that we finally have a multicaster...
        Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
        this.earlyApplicationEvents = null;
        if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
            for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
                getApplicationEventMulticaster().multicastEvent(earlyEvent);
            }
        }
    }
        // Publish the final event.
        publishEvent(new ContextRefreshedEvent(this));

发布了ContextRefreshedEvent事件。

  • CommonAnnotationBeanPostProcessor
    处理@Resource,@PostConstruct @PreDestory 注解
  • AutowiredAnnotationBeanPostProcessor
    处理@AutoWired,@Value注解
  • ApplicationContextAwareProcessor
    处理ApplicationContextAware回调

BeanFactoryPostProcessor

两个相近的接口

public class BeanFacPro implements BeanFactoryPostProcessor, BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("");
        beanFactory.registerSingleton("a",beanDefinition);
    }
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        registry.registerBeanDefinition("",new RootBeanDefinition("value"));
    }
}

该步骤发生在生成了BeanDefinition,但是单例Bean没有创建出来的时机,所以修改BeanDefinition会生效.


refresh

加载配置的资源,要么全部成功,要么失败后全部销毁

Lifecycle

SmartLifecycle可以监听ApplicationContext的启动和关闭

相关文章

网友评论

      本文标题:Day63 Spring 启动过程解析

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