【Spring08】SpringIOC容器启动的过程及原理

SpringIOC容器启动的过程及原理

一、Spring启动概览

Spring的IOC启动的过程重点在于其refresh(); 方法。
在这里插入图片描述

其源码关键节点转化为流程图如下:
在这里插入图片描述

二、Spring启动源码详解

2.1 刷新前的预处理

prepareRefresh(); // Prepare this context for refreshing. 刷新前的预处理;

// Prepare this context for refreshing.
prepareRefresh();
protected void prepareRefresh() {
    // Switch to active.
    // 初始化值
    this.startupDate = System.currentTimeMillis();
    this.closed.set(false);
    this.active.set(true);

    if (logger.isDebugEnabled()) {
        if (logger.isTraceEnabled()) {
            logger.trace("Refreshing " + this);
        }
        else {
            logger.debug("Refreshing " + getDisplayName());
        }
    }

    // Initialize any placeholder property sources in the context environment.
    // 子类自定义个性化属性方法
    initPropertySources();

    // Validate that all properties marked as required are resolvable:
    // see ConfigurablePropertyResolver#setRequiredProperties
    // 校验环境属性合法性
    getEnvironment().validateRequiredProperties();

    // 保存一些早期事件监听器
    // Store pre-refresh ApplicationListeners...
    if (this.earlyApplicationListeners == null) {
        this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
    }
    else {
        // Reset local application listeners to pre-refresh state.
        this.applicationListeners.clear();
        this.applicationListeners.addAll(this.earlyApplicationListeners);
    }

    // Allow for the collection of early ApplicationEvents,
    // to be published once the multicaster is available...
    this.earlyApplicationEvents = new LinkedHashSet<>();
}

该步骤较为重点的操作为:

1)initPropertySources(); 初始化一些属性设置;子类自定义个性化的属性设置方法
2)getEnvironment().validateRequiredProperties(); 校验环境属性合法性
3)保存一些早期事件监听器至 this.applicationListeners

2.2 获取初始化BeanFactory

obtainFreshBeanFactory(); 初始化BeanFactory

// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    refreshBeanFactory();
    return getBeanFactory();
}

该步骤较为重点的操作为:

1)refreshBeanFactory(); 刷新BeanFactory;

protected final void refreshBeanFactory() throws BeansException {
    // 存在BeanFactory则先销毁关闭
    if (hasBeanFactory()) {
        destroyBeans();
        closeBeanFactory();
    }
    try {
        // 初始化BeanFactory this.beanFactory = new DefaultListableBeanFactory();
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        // 赋值ID
        beanFactory.setSerializationId(getId());
        customizeBeanFactory(beanFactory);
        // beanFactory——加载Bean定义信息
        loadBeanDefinitions(beanFactory);
        this.beanFactory = beanFactory;
    }
    catch (IOException ex) {
        throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
    }
}

2)getBeanFactory(); 返回刚才创建的beanFactory对象

2.3 BeanFactory的预准备工作

prepareBeanFactory(beanFactory); BeanFactory的预准备工作(对初始化的BeanFactory进行一些设置);

// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);

在这里插入图片描述

该步骤较为重点的操作为:

1)设置BeanFactory的类加载器、支持表达式解析器…

beanFactory.setBeanClassLoader(getClassLoader());
if (!shouldIgnoreSpel) {
    beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
}
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

2)添加部分的后置处理器【ApplicationContextAwareProcessor】

beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

3)设置忽略自动装配的接口,对于实现这些接口的类容器不进行自动注入;

beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);

4)设置可以解析的自动装配;我们可以直接在任何组件中自动注入(@AutoWire)

BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext

beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);

5)添加后置处理器【ApplicationListenerDetector】用于 ApplicationListeners 事件监听器;

beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

6)给BeanFactory中注册一些能用的组件;environment【ConfigurableEnvironment】、systemProperties、systemEnvironment、applicationStartup

// Register default environment beans.
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
    beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
    beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
    beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
    beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
}

2.4 子类对BeanFactory进一步设置

postProcessBeanFactory(beanFactory); BeanFactory准备工作完成后进行的后置处理器工作;

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
}

在这里插入图片描述

子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置。

例如子类:ServletWebServerApplicationContext 的 postProcessBeanFactory()

添加了一个后置处理器、忽略了ServletContextAware、注册了web的作用域信息。

2.5 执行部分类型后置处理器

invokeBeanFactoryPostProcessors(beanFactory); 执行BeanFactoryPostProcessors;

// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    // 执行部分类型后置处理器
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
	......
}

在这里插入图片描述

该步骤较为重点的操作为:

执行了两个特殊的后置处理器:BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessors

先执行 BeanDefinitionRegistryPostProcessor
1)获取所有的BeanDefinitionRegistryPostProcessor;
2)先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、
3)在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;
4)最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;
invokeBeanDefinitionRegistryPostProcessors() -> postProcessBeanDefinitionRegistry()
invokeBeanFactoryPostProcessors() -> postProcessBeanFactory()

再执行BeanFactoryPostProcessor的方法
1)获取所有的BeanFactoryPostProcessor
2)看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor;
3)在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;
4)最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;
invokeBeanFactoryPostProcessors() -> postProcessBeanFactory()

2.6 注册bean的后置处理器

registerBeanPostProcessors(beanFactory); 注册bean的后置处理器;

// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

在这里插入图片描述

不同接口类型的 BeanPostProcessor,在bean创建前后执行的时机是不一样的

BeanPostProcessor 接口还存在多个子接口:
DestructionAwareBeanPostProcessor、
InstantiationAwareBeanPostProcessor、
SmartInstantiationAwareBeanPostProcessor、
MergedBeanDefinitionPostProcessor【internalPostProcessors】…等等

该步骤较为重点的操作为:

1)所有的后置处理器 BeanPostProcessor,都可以默认通过PriorityOrdered、Ordered接口来执行优先级

2)先注册 PriorityOrdered 优先级接口的BeanPostProcessor
把每个BeanPostProcessor添加至 BeanFactory中
registerBeanPostProcessors(beanFactory, orderedPostProcessors); -> beanFactory.addBeanPostProcessor(postProcessor);

private static void registerBeanPostProcessors(
    ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

    if (beanFactory instanceof AbstractBeanFactory) {
        // Bulk addition is more efficient against our CopyOnWriteArrayList there
        ((AbstractBeanFactory) beanFactory).addBeanPostProcessors(postProcessors);
    }
    else {
        for (BeanPostProcessor postProcessor : postProcessors) {
            beanFactory.addBeanPostProcessor(postProcessor);
        }
    }
}

3)再注册实现Ordered接口的BeanPostProcessor

4)再注册没有实现任何优先级接口的

5)最后注册 MergedBeanDefinitionPostProcessor

if (pp instanceof MergedBeanDefinitionPostProcessor) {
    internalPostProcessors.add(pp);
}

// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);

6)添加一个 ApplicationListenerDetector :在bean创建完成后检查bean是否是 ApplicationListener
如果是则添加至 this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);

// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

2.7 初始化MessageSource组件

initMessageSource(); 初始化MessageSource组件(做国际化功能、消息绑定、消息解析);

// Initialize message source for this context.
initMessageSource();
protected void initMessageSource() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    // 查看容器中是否存在 id为messageSource的,类型是MessageSource的组件
    if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
        // 有则赋值给 messageSource
        this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
        // Make MessageSource aware of parent MessageSource.
        // 设置 messageSource的父级
        if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
            HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
            if (hms.getParentMessageSource() == null) {
                // Only set parent context as parent MessageSource if no parent MessageSource
                // registered already.
                hms.setParentMessageSource(getInternalParentMessageSource());
            }
        }
        if (logger.isTraceEnabled()) {
            logger.trace("Using MessageSource [" + this.messageSource + "]");
        }
    }
    else {
        // 没有自己创建一个DelegatingMessageSource;
        // Use empty MessageSource to be able to accept getMessage calls.
        DelegatingMessageSource dms = new DelegatingMessageSource();
        dms.setParentMessageSource(getInternalParentMessageSource());
        // 把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
        this.messageSource = dms;
        beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
        if (logger.isTraceEnabled()) {
            logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
        }
    }
}

MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;

该步骤较为重点的操作为:

1)看容器中是否有id为messageSource的,类型是MessageSource的组件.
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) ?

2)容器中存在,取到bean赋值给messageSource

3)容器中不存在,自己创建一个DelegatingMessageSource;
把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);

2.8 初始化事件派发器

initApplicationEventMulticaster(); 初始化事件派发器;事件派发器用于事件监听和派发。

// Initialize event multicaster for this context.
initApplicationEventMulticaster();
protected void initApplicationEventMulticaster() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    // 查询是否存在ID为:applicationEventMulticaster 的bean
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
        // 存在给 this.applicationEventMulticaster 赋值
        this.applicationEventMulticaster =
            beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
        if (logger.isTraceEnabled()) {
            logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
        }
    }
    else {
        // 没有这初始化创建多播器
        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
        // 并加到容器中,自动注入这个 applicationEventMulticaster
        beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
        if (logger.isTraceEnabled()) {
            logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
                         "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
        }
    }
}

2.9 子类重写容器刷新方法

onRefresh(); 子类重写这个方法,在容器刷新的时候可以自定义逻辑;

// Initialize other special beans in specific context subclasses.
onRefresh();
protected void onRefresh() throws BeansException {
    // For subclasses: do nothing by default.
}

2.10 注册事件监听器

registerListeners(); 注册事件监听器;

// Check for listener beans and register them.
registerListeners();
protected void registerListeners() {
    // Register statically specified listeners first.
    // 获取已有的 this.applicationListeners 所有监听器 ApplicationListener
    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!
    // 获取ApplicationListener类的监听器
    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...
    // 派发之前步骤产生的提前事件; this.earlyApplicationEvents
    Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    this.earlyApplicationEvents = null;
    if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
        for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
            getApplicationEventMulticaster().multicastEvent(earlyEvent);
        }
    }
}

该步骤较为重点的操作为:

1)从容器中拿到所有的监听器 ApplicationListener.class
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);

2)把他们注册到 applicationEventMulticaster (事件多播器)中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

3)派发之前步骤产生的事件; this.earlyApplicationEvents
getApplicationEventMulticaster().multicastEvent(earlyEvent);

2.11 【重点】初始化余下单实例bean

finishBeanFactoryInitialization(beanFactory); 初始化剩下的单实例bean;

// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);

finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    // ......
    
    // Instantiate all remaining (non-lazy-init) singletons.
    // 初始化后剩下的单实例bean
    beanFactory.preInstantiateSingletons();
}
public void preInstantiateSingletons() throws BeansException {
    if (logger.isTraceEnabled()) {
        logger.trace("Pre-instantiating singletons in " + this);
    }

    // Iterate over a copy to allow for init methods which in turn register new bean definitions.
    // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
    // 1)获取容器中所有的bean
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

    // Trigger initialization of all non-lazy singleton beans...
    for (String beanName : beanNames) {
        // 2)获取bean的定义信息
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        // 3)bean不是抽象的,是单实例,不是懒加载的
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            // 判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;是则为FactoryBean创建bean,使用其getObject()返回的bean
            if (isFactoryBean(beanName)) {
                Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                if (bean instanceof FactoryBean) {
                    FactoryBean<?> factory = (FactoryBean<?>) bean;
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged(
                            (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                            getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                       ((SmartFactoryBean<?>) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
            }
            else {
                // 4)利用getBean(beanName) -> doGetBean() ;创建对象
                getBean(beanName);
            }
        }
    }

    // Trigger post-initialization callback for all applicable beans...
    // 5)所有的bean都利用getBean()创建完成后
    for (String beanName : beanNames) {
        Object singletonInstance = getSingleton(beanName);
        // bean 是否为 SmartInitializingSingleton,为则执行其 afterSingletonsInstantiated()方法
        if (singletonInstance instanceof SmartInitializingSingleton) {
            StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
                .tag("beanName", beanName);
            SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    smartSingleton.afterSingletonsInstantiated();
                    return null;
                }, getAccessControlContext());
            }
            else {
                // SmartInitializingSingleton -> afterSingletonsInstantiated()
                smartSingleton.afterSingletonsInstantiated();
            }
            smartInitialize.end();
        }
    }
}

重点解析一下第四点 —— 创建对象

利用getBean(beanName) -> doGetBean() ;创建对象
protected <T> T doGetBean(
    String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
    throws BeansException {

    String beanName = transformedBeanName(name);
    Object beanInstance;

    // Eagerly check singleton cache for manually registered singletons.
    // 1)getSingleton(beanName); 先获取缓存中保存的单实例bean
    Object sharedInstance = getSingleton(beanName);
    // 获取的bean不为空,则获取bean实例返回
    if (sharedInstance != null && args == null) {
        if (logger.isTraceEnabled()) {
            if (isSingletonCurrentlyInCreation(beanName)) {
                logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                             "' that is not fully initialized yet - a consequence of a circular reference");
            }
            else {
                logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }
        beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    }
    // 2)缓存中获取不到,开始bean的创建过程
    else {
        // ......

        if (!typeCheckOnly) {
            // 3)首先标记当前bean已经被创建,保证bean的单例;
            markBeanAsCreated(beanName);
        }

        StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
            .tag("beanName", name);
        try {
            if (requiredType != null) {
                beanCreation.tag("beanType", requiredType::toString);
            }
            // 4)获取bean的定义信息;RootBeanDefinition
            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
            checkMergedBeanDefinition(mbd, beanName, args);

            // Guarantee initialization of beans that the current bean depends on.
            // 5)获取当前bean依赖的其他bean;如果有按照getBean()把依赖的bean先创建出来;
            String[] dependsOn = mbd.getDependsOn();
            if (dependsOn != null) {
                for (String dep : dependsOn) {
                    if (isDependent(beanName, dep)) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                                        "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                    }
                    registerDependentBean(dep, beanName);
                    try {
                        getBean(dep);
                    }
                    catch (NoSuchBeanDefinitionException ex) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                                        "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                    }
                }
            }

            // Create bean instance.
            if (mbd.isSingleton()) {
                // 7)将创建的bean添加到缓存中 singletonObjects,ioc容器就是这些map;很多的map里面保存了单实例beans,环境信息....
                // getSingleton() -> addSingleton(beanName, singletonObject);
                sharedInstance = getSingleton(beanName, () -> {
                    try {
                        // 6)启动单实例bean的创建流程
                        return createBean(beanName, mbd, args);
                    }
                });
                beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
            }

            else if (mbd.isPrototype()) {
                // It's a prototype -> create a new instance.
                Object prototypeInstance = null;
                try {
                    beforePrototypeCreation(beanName);
                    prototypeInstance = createBean(beanName, mbd, args);
                }
                finally {
                    afterPrototypeCreation(beanName);
                }
                beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            }

            else {
                String scopeName = mbd.getScope();
                if (!StringUtils.hasLength(scopeName)) {
                    throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
                }
                Scope scope = this.scopes.get(scopeName);
                if (scope == null) {
                    throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                }
                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        beforePrototypeCreation(beanName);
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        finally {
                            afterPrototypeCreation(beanName);
                        }
                    });
                    beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                }
                catch (IllegalStateException ex) {
                    throw new ScopeNotActiveException(beanName, scopeName, ex);
                }
            }
        }
        finally {
            beanCreation.end();
        }
    }

    return adaptBeanInstance(name, beanInstance, requiredType);
}

重点解析 第 6)启动单实例bean的创建流程

createBean(beanName, mbd, args); 创建bean

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    throws BeanCreationException {

   // ......
    
    try {
        // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
        // 1)给BeanPostProcessors一个返回代理而不是目标bean实例的机会。
        Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
        // 2)如果步骤1,有代理对象,则直接返回
        if (bean != null) {
            return bean;
        }
    }

    try {
        // 3)创建对象
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
        if (logger.isTraceEnabled()) {
            logger.trace("Finished creating instance of bean '" + beanName + "'");
        }
        return beanInstance;
    } // ......
}

1)Object bean = resolveBeforeInstantiation(beanName, mbdToUse); BeanPostProcessors返回代理对象

让BeanPostProcessor先拦截【InstantiationAwareBeanPostProcessor】,返回代理对象【AOP自动配置开启原理】

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    Object bean = null;
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        // Make sure bean class is actually resolved at this point.
        // 判断 BeanPostProcessor 是否存在 InstantiationAwareBeanPostProcessor
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            Class<?> targetType = determineTargetType(beanName, mbd);
            if (targetType != null) {
                // 先触发:postProcessBeforeInstantiation();
                bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                // 如果有返回值:触发postProcessAfterInitialization();
                if (bean != null) {
                    bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                }
            }
        }
        mbd.beforeInstantiationResolved = (bean != null);
    }
    return bean;
}

2)如果步骤1,有代理对象,则直接返回
3)如果步骤1没值,这进行bean的创建

Object beanInstance = doCreateBean(beanName, mbdToUse, args);

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    throws BeanCreationException {

    // Instantiate the bean.
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        // 1)【创建bean实例】利用工厂方法或者对象的构造器
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    // Allow post-processors to modify the merged bean definition.
    synchronized (mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                // 2)调用 MergedBeanDefinitionPostProcessor -> postProcessMergedBeanDefinition()
                applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            }
            mbd.postProcessed = true;
        }
    }
    // ......

    // Initialize the bean instance.
    Object exposedObject = bean;
    try {
        // 3)【bean属性赋值】上述对bean进行实例化了,但是bean并没有具体的属性值
        populateBean(beanName, mbd, instanceWrapper);
        // 4)【bean初始化】
        exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
    // ......

    // Register bean as disposable.
    // 5)注册bean的销毁方法 DisposableBeanAdapter -> DisposableBean
    try {
        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
    catch (BeanDefinitionValidationException ex) {
        throw new BeanCreationException(
            mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    }

    return exposedObject;
}

3)【bean属性赋值】上述对bean进行实例化了,但是bean并没有具体的属性值

populateBean(beanName, mbd, instanceWrapper);

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
   	// ......

    // 1)赋值之前 hasInstantiationAwareBeanPostProcessors() 判断是否为 InstantiationAwareBeanPostProcessor
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
            // 执行 InstantiationAwareBeanPostProcessor -> postProcessAfterInstantiation()
            if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                return;
            }
        }
    }

    PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

	// ......

    // 2)再次拿到 InstantiationAwareBeanPostProcessor 后置处理器
    boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

    PropertyDescriptor[] filteredPds = null;
    if (hasInstAwareBpps) {
        if (pvs == null) {
            pvs = mbd.getPropertyValues();
        }
        // 调用 postProcessProperties() 、 postProcessPropertyValues() 方法 获取bean属性的值
        for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
            PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
            if (pvsToUse == null) {
                if (filteredPds == null) {
                    filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                }
                pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                if (pvsToUse == null) {
                    return;
                }
            }
            pvs = pvsToUse;
        }
    }
	// ......

    // 3)应用bean属性的值:为属性利用setter方法进行赋值
    if (pvs != null) {
        applyPropertyValues(beanName, mbd, bw, pvs);
    }
}

4)【bean初始化】

exposedObject = initializeBean(beanName, exposedObject, mbd);

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    // 1)【执行Aware接口方法】执行部分xxxAware接口的方法; invokeAwareMethods(beanName, bean);
    if (System.getSecurityManager() != null) {
        AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            invokeAwareMethods(beanName, bean);
            return null;
        }, getAccessControlContext());
    }
    else {
        invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
        // 2)【执行后置处理器之前方法】 BeanPostProcessor -> postProcessBeforeInitialization(result, beanName);
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }

    try {
        // 3) 【执行初始化方法】
        invokeInitMethods(beanName, wrappedBean, mbd);
    }

    
    if (mbd == null || !mbd.isSynthetic()) {
        // 4)【执行后置处理器之后方法】 BeanPostProcessor -> postProcessAfterInitialization(result, beanName);
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
}

3)【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);

​ 1)bean是否是 InitializingBean 接口的实现;是执行接口规定的初始化方法

​ ((InitializingBean) bean).afterPropertiesSet();

​ 2)是否自定义初始化方法; getInitMethodName();

​ mbd.getInitMethodName(); ——》invokeCustomInitMethod(beanName, bean, mbd);

2.12 完成IOC容器创建

finishRefresh(); 完成BeanFactory的初始化创建工作;IOC容器创建完成;

// Last step: publish corresponding event.
finishRefresh();
protected void finishRefresh() {
    // Clear context-level resource caches (such as ASM metadata from scanning).
    // 清除上下文级别的资源缓存(如扫描中的ASM元数据)
    clearResourceCaches();

    // Initialize lifecycle processor for this context.
    // 初始化和生命周期有关的后置处理器; LifecycleProcessor
    initLifecycleProcessor();

    // Propagate refresh to lifecycle processor first.
    // 获取前面的生命周期处理器,回调其onRefresh()方法
    getLifecycleProcessor().onRefresh();

    // Publish the final event.
    // 发布容器刷新完成事件;
    publishEvent(new ContextRefreshedEvent(this));

    // Participate in LiveBeansView MBean, if active.
    // 注册MBean
    if (!NativeDetector.inNativeImage()) {
        LiveBeansView.registerApplicationContext(this);
    }
}

该步骤较为重点的操作为:

1)clearResourceCaches(); 清除上下文级别的资源缓存(如扫描中的ASM元数据)

2)initLifecycleProcessor(); 初始化和生命周期有关的后置处理器; LifecycleProcessor

​ 默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor(),加入到容器;

​ LifecycleProcessor -> void onRefresh(); / void onClose();

3)getLifecycleProcessor().onRefresh(); 获取前面的生命周期处理器,回调其onRefresh()方法

4)publishEvent(new ContextRefreshedEvent(this)); 发布容器刷新完成事件;

5)LiveBeansView.registerApplicationContext(this); 注册MBean

三、Spring启动源码全过程

Spring容器的 refresh(); 【创建和刷新】:
1)prepareRefresh(); // Prepare this context for refreshing. 刷新前的预处理;
	1)initPropertySources(); 初始化一些属性设置;子类自定义个性化的属性设置方法
	2)getEnvironment().validateRequiredProperties(); 校验环境属性合法性
	3)保存一些早期事件监听器至 this.applicationListeners

2)beanFactory = obtainFreshBeanFactory(); 获取BeanFactory;
	1)refreshBeanFactory(); 刷新BeanFactory;
		在 GenericApplicationContext 创建了 this.beanFactory = new DefaultListableBeanFactory();
		赋值了ID this.beanFactory.setSerializationId(getId());
	2)getBeanFactory(); 返回刚才创建的beanFactory对象

3)prepareBeanFactory(beanFactory); BeanFactory的预准备工作(对初始化的BeanFactory进行一些设置);
	1)设置BeanFactory的类加载器、支持表达式解析器...
	2)添加部分的后置处理器【ApplicationContextAwareProcessor】
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
	3)设置忽略自动装配的接口,对于实现这些接口的类容器不进行自动注入;
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);...
	4)设置可以解析的自动装配;我们可以直接在任何组件中自动注入(@AutoWire)
		beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
		beanFactory.registerResolvableDependency(ApplicationContext.class, this);...ResourceLoader、ApplicationEventPublisher
	5)添加后置处理器【ApplicationListenerDetector】用于 ApplicationListeners 事件监听器;
	6)给BeanFactory中注册一些能用的组件;environment【ConfigurableEnvironment】、systemProperties、systemEnvironment、applicationStartup

4)postProcessBeanFactory(beanFactory); BeanFactory准备工作完成后进行的后置处理器工作;
子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置

===================================== 以上为BeanFactory的预创建和准备工作 ==============================================================
5)invokeBeanFactoryPostProcessors(beanFactory); 执行BeanFactoryPostProcessors;
	BeanFactoryPostProcessors 和 BeanDefinitionRegistryPostProcessor

	先执行 BeanDefinitionRegistryPostProcessor
	1)、获取所有的BeanDefinitionRegistryPostProcessor;
	2)、先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、
	3)、在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;
	4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;
	invokeBeanDefinitionRegistryPostProcessors() -> postProcessBeanDefinitionRegistry()
	invokeBeanFactoryPostProcessors() -> postProcessBeanFactory()

    再执行BeanFactoryPostProcessor的方法
	BeanFactoryPostProcessors:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的;
	执行 invokeBeanFactoryPostProcessors() 方法
    1)、获取所有的BeanFactoryPostProcessor
    2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、
    3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;
    4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;
    invokeBeanFactoryPostProcessors() -> postProcessBeanFactory()

6)registerBeanPostProcessors(beanFactory); 注册bean的后置处理器;
    不同接口类型的 BeanPostProcessor,在bean创建前后执行的时机是不一样的
    BeanPostProcessor 接口还存在多个子接口:
    DestructionAwareBeanPostProcessor、
    InstantiationAwareBeanPostProcessor、
    SmartInstantiationAwareBeanPostProcessor、
    MergedBeanDefinitionPostProcessor【internalPostProcessors】...等等

	1)所有的后置处理器 BeanPostProcessor,都可以默认通过PriorityOrdered、Ordered接口来执行优先级
	2)先注册 PriorityOrdered 优先级接口的BeanPostProcessor
		把每个BeanPostProcessor添加至 BeanFactory中
		registerBeanPostProcessors(beanFactory, orderedPostProcessors); -> beanFactory.addBeanPostProcessor(postProcessor);
    3)再注册实现Ordered接口的BeanPostProcessor
    4)再注册没有实现任何优先级接口的
    5)最后注册 MergedBeanDefinitionPostProcessor
    6)添加一个 ApplicationListenerDetector :在bean创建完成后检查bean是否是 ApplicationListener
		如果是则添加至 this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);

7)initMessageSource(); 初始化MessageSource组件(做国际化功能、消息绑定、消息解析) ;
	1)、看容器中是否有id为messageSource的,类型是MessageSource的组件
    	如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
		MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
	2)、把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
        beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
        MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);

8)initApplicationEventMulticaster(); 初始化事件派发器;
	1)先去容器中查找ID为 "applicationEventMulticaster" 的组件
	2)如果没有这初始化创建多播器 ,并加到容器中,就可以在其他组件需要派发事件时,自动注入这个 applicationEventMulticaster
		this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);

9)onRefresh(); 子类重写这个方法,在容器刷新的时候可以自定义逻辑;

10)registerListeners(); 注册事件监听器;
	1)从容器中拿到所有的监听器 ApplicationListener.class
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
	2)把他们注册到 applicationEventMulticaster (事件多播器)中
		getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
	3)派发之前步骤产生的事件; this.earlyApplicationEvents
		getApplicationEventMulticaster().multicastEvent(earlyEvent);

11)finishBeanFactoryInitialization(beanFactory); 初始化剩下的单实例bean
	beanFactory.preInstantiateSingletons(); 初始化后剩下的单实例bean
	1)获取容器中所有的bean,依次进行初始化和创建对象
	2)获取bean的定义信息
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
	3)bean不是抽象的,是单实例,不是懒加载的
		if(!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
		1)判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;是则为FactoryBean创建bean,使用其getObject()返回的bean
         	if (isFactoryBean(beanName))
		2)不是FactoryBean,利用getBean(beanName);创建对象
	4)利用getBean(beanName) -> doGetBean() ;创建对象
		1)getSingleton(beanName); 先获取缓存中保存的单实例bean,如果能获取到说明这个bean之前被创建过(所有创建过的单实例Bean都会被缓存起来) 【三级缓存】
			this.singletonObjects.get(beanName); ->  Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); —> 单例对象的缓存:Cache of singleton objects
		2)缓存中获取不到,开始bean的创建过程
		3)markBeanAsCreated(beanName); 首先标记当前bean已经被创建,保证bean的单例;
		4)获取bean的定义信息;RootBeanDefinition
		5)获取当前bean依赖的其他bean;如果有按照getBean()把依赖的bean先创建出来;
		6)启动单实例bean的创建流程 createBean(beanName, mbd, args);
			1)Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 
				让BeanPostProcessor先拦截【InstantiationAwareBeanPostProcessor】,返回代理对象【AOP自动配置开启原理】
				先触发:postProcessBeforeInstantiation();
                如果有返回值:触发postProcessAfterInitialization();
            2)如果步骤1,有代理返回值,则直接返回;否则调用步骤3
            3)	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
            	1)【创建bean实例】;createBeanInstance(beanName, mbd, args);
                	利用工厂方法或者对象的构造器
                2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                    调用  MergedBeanDefinitionPostProcessor -> postProcessMergedBeanDefinition()
                3)【bean属性赋值】上述对bean进行实例化了,但是bean并没有具体的属性值
                    populateBean(beanName, mbd, instanceWrapper);
                    1)赋值之前 hasInstantiationAwareBeanPostProcessors() 判断是否为 InstantiationAwareBeanPostProcessor
                    	InstantiationAwareBeanPostProcessor -> postProcessAfterInstantiation()
                    2)再次拿到 InstantiationAwareBeanPostProcessor 后置处理器
                        调用 postProcessProperties() 、 postProcessPropertyValues() 方法 获取bean属性的值
                   =====赋值之前:===
                   3)应用bean属性的值:为属性利用setter方法进行赋值
                        applyPropertyValues(beanName, mbd, bw, pvs);
                4)【bean初始化】 initializeBean(beanName, exposedObject, mbd);
                    1)【执行Aware接口方法】执行部分xxxAware接口的方法; invokeAwareMethods(beanName, bean);
                        BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
                    2)【执行后置处理器之前方法】 applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                         BeanPostProcessor -> postProcessBeforeInitialization(result, beanName);
                    3) 【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
                         1)bean是否是 InitializingBean 接口的实现;是执行接口规定的初始化方法
                             ((InitializingBean) bean).afterPropertiesSet();
                         2)是否自定义初始化方法; getInitMethodName();
                    4)【执行后置处理器之后方法】applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
                         BeanPostProcessor -> postProcessAfterInitialization(result, beanName);
                    5)注册bean的销毁方法;registerDisposableBeanIfNecessary(beanName, bean, mbd);
                         DisposableBeanAdapter -> DisposableBean
		7)将创建的bean添加到缓存中 singletonObjects
			getSingleton() -> addSingleton(beanName, singletonObject);
			ioc容器就是这些map;很多的map里面保存了单实例beans,环境信息....
	5)所有的bean都利用getBean()创建完成后,检查所有bean是否是 SmartInitializingSingleton 接口的bean
		是的话执行: org.springframework.beans.factory.SmartInitializingSingleton -> afterSingletonsInstantiated()

12)finishRefresh(); 完成BeanFactory的初始化创建工作;IOC容器创建完成;
	1)clearResourceCaches(); 清除上下文级别的资源缓存(如扫描中的ASM元数据)
	2)initLifecycleProcessor(); 初始化和生命周期有关的后置处理器; LifecycleProcessor
		默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor(),加入到容器;
		LifecycleProcessor -> void onRefresh(); / void onClose();
	3) getLifecycleProcessor().onRefresh(); 获取前面的生命周期处理器,回调其onRefresh()方法
	4)publishEvent(new ContextRefreshedEvent(this)); 发布容器刷新完成事件;
	5)LiveBeansView.registerApplicationContext(this); 注册MBean

四、总结

1)Spring容器在启动的时候,会先保存所有注册进来的bean的定义信息

  • xml注册bean;
  • 注解注册bean;@Service,@Component,@Bean

2)Spring容器会在合适的时机创建这些Bean

  • 用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
  • 统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();

3)后置处理器:

  • 每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
  • AutowiredAnnotationBeanPostProcessor:处理自动注入
  • AnnotationAwareAspectJAutoProxyCreator:来做AOP功能

4)事件驱动模型;

  • ApplicationListener;事件监听;
  • ApplicationEventMulticaster;事件派发;

InitializingSingleton 接口的bean
是的话执行: org.springframework.beans.factory.SmartInitializingSingleton -> afterSingletonsInstantiated()

12)finishRefresh(); 完成BeanFactory的初始化创建工作;IOC容器创建完成;
1)clearResourceCaches(); 清除上下文级别的资源缓存(如扫描中的ASM元数据)
2)initLifecycleProcessor(); 初始化和生命周期有关的后置处理器; LifecycleProcessor
默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor(),加入到容器;
LifecycleProcessor -> void onRefresh(); / void onClose();
3) getLifecycleProcessor().onRefresh(); 获取前面的生命周期处理器,回调其onRefresh()方法
4)publishEvent(new ContextRefreshedEvent(this)); 发布容器刷新完成事件;
5)LiveBeansView.registerApplicationContext(this); 注册MBean

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值